![](/img/trans.png)
[英]Monkey patch a python instance method using the original method from the class
[英]Python: Mocking an instance of a class inside a method using @patch
我在 Python 中有一個方法foo
可以創建一個服務類。 我想模擬 Service 類,但是當我運行測試時,它仍然嘗試實例化該類。 這是我的設置的簡化版本:
class Service:
def __init__(self, service):
self.service_stuff = service
def run_service(self):
do_service_stuff()
def foo:
new_service = Service("bar")
new_service.run_service()
然后我的單元測試:
@patch('mymodule.service_file.Service')
def test_foo(self, mock_service):
foo()
我想運行 foo,但讓它使用我的模擬對象而不是創建實際的 Service 實例,但是當我運行它時,它會嘗試實例化 Service() 的實際實例並像往常一樣運行 foo()它似乎可以識別我放入補丁中的字符串簽名。 為什么會這樣?
弄清楚了:對類的補丁引用必須是方法本身中的導入名稱,而不是原始類,類似於https://stackoverflow.com/a/32461515/4234853
所以補丁應該看起來像: @patch('mymodule.foo_file.Service')
而不是試圖直接修補類。
在這種情況下,使您的函數更易於測試可能會更容易:
def foo(cls=Service):
new_service = cls("bar")
new_service.run_service()
那么你的測試不需要修補任何東西。
def test_foo(self):
mock_service = Mock()
foo(mock_service)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.