编程语言
首页 > 编程语言> > 如何在Python中对猴子补丁进行单元测试

如何在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