如何在Python中对猴子补丁进行单元测试
作者:互联网
我有一个像这样的实用方法
def my_patch_method(self):
pass
def patch_my_lib():
from mylib import MyClass
MyClass.target_method = my_patch_method
return MyClass()
此测试失败:
self.assertEqual(my_patch_method, patch_my_lib().target_method)
虽然这个有效:
self.assertEqual(my_patch_method.__name__, patch_my_lib().target_method.__name__)
由于补丁方法没有相同的名称,这仍然是可接受的证据,证明patch_my_lib()正在做它所付出的代价,但为什么第一个工作没有像我期望的那样?而且,有没有办法“修复”它?
解决方法:
你的第一次测试失败的原因是,一旦你将函数修补到你的类中,它就不再是同一个对象了.
>>> def foo(self): pass
...
>>> class Foo: pass
...
>>> Foo.bar = foo
>>> type(Foo.bar)
<type 'instancemethod'>
>>> type(foo)
<type 'function'>
>>>
>>> Foo.bar is foo
False
>>> Foo.bar == foo
False
实际上,原始函数和新方法有不同的类型.相反,让你的第一次测试检查这个条件:
>>> Foo.bar.im_func is foo
True
也许这样:self.assertIs(my_patch_method,patch_my_lib().target_method.im_func)
标签:python,unit-testing,monkeypatching 来源: https://codeday.me/bug/20190529/1181276.html