[英]How do I unit test a monkey patch in 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方法的名稱不同,因此仍然可以接受的證據表明patch_my_lib()
正在執行其應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)
嘗試:
self.assertEqual(my_patch_method, patch_my_lib().target_method.im_func)
您正在從patch_my_lib返回一個實例,因此將函數與綁定方法進行比較
這樣的事情應該過去了
self.assertEqual(my_patch_method, patch_my_lib().target_method.im_func)
但是最好檢查一下您正在修補的行為是否正常
MyClass.target_method = my_patch_method
將您的函數設置為MyClass
的類函數,但是您使用return MyClass()
該類的實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.