簡體   English   中英

如何在Python中對猴子補丁進行單元測試

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM