我想要做的事,如下面的例子(發現here)使用補丁嘲笑的功能(而不是方法)
>>> with patch.object(ProductionClass, 'method', return_value=None) as mock_method:
... thing = ProductionClass()
... thing.method(1, 2, 3)
但是這是在修補叫ProductionClass
的method
方法。我想在上下文中修補一個通用函數。理想的東西看起來像......
with path.something(my_fn, return_value=my_return) as mock_function:
do_some_other_fn()
my_fn
被稱爲內do_some_other_fn
深,因此難以直接模擬出。這似乎應該是簡單的,但我無法找到正確的語法
編輯在模塊do_some_other_fn
生活我導入my_fn
像以下
from my_module import my_fn
所以我需要一種方法能夠告訴模擬從模塊外面補丁。這可能嗎?
EDIT 2我想,這使得它更清楚我所期待的
這工作,但並不理想:
import my_module
with patch('my_module.fn', return_value='hello') as patch_context:
x = my_module.fn()
# x now contains 'hello'
但是我寧願有像這樣的工作(或類似的東西)
from my_module import fn
with patch('my_module.fn', return_value='hello') as patch_context:
x = fn()
# x contains real result from real call to fn()
這個問題的答案。如果使用'patch('mymodule.func'....)'但深入我的代碼中,我使用'from mymodule import func'導入,然後調用'func()',它是否仍然適合修補? – sedavidw
只做過一些測試,看起來不像這樣。如果我執行'mymodule.func',修補程序可以正常工作,但我無法使用'from mymodule import func'。我已經更新了這個問題,以便更清楚地說明 – sedavidw
@sedavidw,正如我在答案中明確指出的那樣,您應該看看https://docs.python.org/3/library/unittest.mock.html#where-補丁。 –