我对 golang 单元测试感到困惑。
我有 2 个Test_xxx函数,例如Test_1和Test_2。
在中Test_1,我将更改一个全局变量,可以Test_2看到变化吗?
此外,如果我使用monkey patch而不是更改全局变量,其他Test_xxx函数会感知到修补吗?
即,我是否有必要在返回时使用 defer 取消 func 替换Test_xxx?
在红宝石中:
module Example
  class ExampleValidator
    def mymethod
      # do something important
    end
  end
end
是否可以使其mymethod不可变(即没有猴子修补)?
不然“冻结”全班也可以接受ExampleValidator。
关于猴子修补如此酷或猴子补丁是地球上最糟糕的事情,我听过很多关于oahs和aahs的消息.我认为,如果你编写一些代码然后其他人改变其功能来做其他事情就不好了.但我正在寻找一个可能真的伤害你的情况的具体例子.我的意思是,我一直在编写代码,然后我的同事会对其进行更改.那么,猴子修补与此有何不同?可能发生的最坏情况是什么?
我们正在运行django并与现有应用程序共享数据库.我们希望使用现有的"用户"表(不是Django自己的)来存储用户信息.
看起来可以在User定义的Meta类中更改Django使用的表的名称.
但我们宁愿不改变Django核心本身.
所以我们认为我们可以像这样对核心auth.User类进行子类化:
class OurUser(User) :
    objects = UserManager()
    class Meta:
        db_table = u'our_user_table'
这里,目的不是为自定义的User类添加任何额外的字段.但只是使用替代表.
但是,这会失败(可能是因为ORM假设our_user_table应该有一个外键引用回原始用户表,而不是这样).
那么,这种明智的做法是做我们想做的事吗?我是否错过了将类映射到表格的简单方法?或者,如果没有,这可以成功吗?
更新:
我想我可以通过在local_settings.py中"修补"用户的_meta来进行我想要的更改.
User._meta.db_table = 'our_user_table'
任何人都可以想到如果我这样做会发生什么坏事吗?(特别是在相当典型的Django/Pinax应用程序的上下文中?)
假设您的同事monkeypat修复Fixnum类并重新定义+方法以减去而不是添加:
class Fixnum
  def +(x)
    self - x
  end
end
>> 5 + 3
=> 2
您的问题是您想要访问+方法的原始功能.因此,您将此代码放入相同的源文件之前.它在将 monkeypatches 之前将+方法别名为"original_plus" .
class Fixnum
  alias_method :original_plus, :+
end
class Fixnum
  def +(x)
    self - x
  end
end
现在,您可以通过original_plus访问+方法的原始功能
>> 5 + 3
=> 2
>> 5.original_plus(3)
=> 8
但我需要知道的是:
有没有其他方法加载这个别名BEFORE他的monkeypatch加载除了将其粘贴到他修改的相同源文件中?
我的问题有两个原因:
我对如何让这个工作感兴趣:
me = "this is a string"
class << me
  alias :old<< :<<
  def <<(text)
    old<<(text)
    puts "appended #{text}"
  end
end
我希望当某些内容被附加到me变量时,该对象将使用重新定义的方法.
如果我尝试运行它,我会syntax error, unexpected ':', expecting kEND接受:<<.
我使用Rails 3并得到一个如下所示的错误:
undefined method `persisted?' for []:Array
我想monkeypatch来解决这个问题.首先:它应该是什么样的?我对Ruby的源代码中的Array类的嵌套知之甚少.我很欣赏这个指导.
我们如何在python中获取内置打印函数的函数指针.
它似乎与其他内置函数的行为不同:
>>> a = print
SyntaxError: invalid syntax
>>>> dir(print)
SyntaxError: invalid syntax
>>>> m = map
OK
>>>> dir(map)
['__call__', '__class__', [...] '__str__', '__subclasshook__']
Code:
from unittest.mock import Mock
mock = Mock()
print('mock.f():', id(mock.f()))
print('mock.f().g().h():', id(mock.f().g().h()))
print('mock():', id(mock()))
print('mock().f():', id(mock().f()))
print()
print('mock.f():', id(mock.f()))
print('mock.f().g().h():', id(mock.f().g().h()))
print('mock():', id(mock()))
print('mock().f():', id(mock().f()))
print()
print('mock.f(1):', id(mock.f(1)))
print('mock.f(2).g(3).h(4):', id(mock.f(2).g(3).h(4)))
print('mock(5):', id(mock(5)))
print('mock(6).f(7):', id(mock(6).f(7)))
print()
Output:
mock.f(): 4483288208
mock.f().g().h(): 4483354192
mock(): 4483368976
mock().f(): 4483708880
mock.f(): 4483288208
mock.f().g().h(): 4483354192
mock(): 4483368976
mock().f(): 4483708880
mock.f(1): 4483288208
mock.f(2).g(3).h(4): 4483354192
mock(5): 4483368976
mock(6).f(7): 4483708880
Observation:
The output shows that a specified chained function call on a mock always returns the same object within the …
monkeypatching ×10
python ×4
ruby ×4
unit-testing ×2
django ×1
function ×1
go ×1
mocking ×1
operators ×1
pointers ×1
python-2.7 ×1