生產文件(production_file.py)工作是:python3模擬並不適用於所有的路徑
class MyError(Exception):
pass
class MyClass:
def __init__(self):
self.value = None
def set_value(self, value):
self.value = value
def foo(self):
raise RuntimeError("error!")
class Caller:
def bar(self, smth):
obj = MyClass()
obj.set_value(smth)
try:
obj.foo()
except MyError:
pass
obj.set_value("str2")
obj.foo()
測試文件(test.py):
import unittest
from unittest.mock import patch
from unittest.mock import call
from production_file import MyClass, Caller
class MyTest(unittest.TestCase):
def test_caller(self):
with patch('production_file.MyClass', autospec=MyClass) as MyClassMock:
my_class_mock_obj = MyClassMock.return_value
my_class_mock_obj.foo.side_effect = [MyError("msg"), "text"]
caller = Caller()
caller.bar("str1")
calls = [call("str1"), call("str2")]
my_class_mock_obj.set_value.assert_has_calls(calls)
if __name__ == '__main__':
unittest.main()
這上面的作品。但是,如果我移動生產類(MyError,MyClass的,來電顯示)進入測試文件,並更新補丁:
with patch('test.MyClass', autospec=MyClass) as MyClassMock:
那麼實例方法「富」不再嘲笑。
有沒有人知道這是爲什麼?
我也遇到過一些更復雜的代碼的類似問題,其中生產代碼位於my_package/src/production_file.py中,而測試位於my_package/tests/test_file.py中。 Python對路徑不產生任何錯誤,路徑是正確的,但仍然模擬不起作用。
有趣......但爲什麼不產生錯誤,如果路徑錯誤? – Feoggou
因爲沒有任何問題,它只是修補錯誤的地方,如果你有一個'test.py'文件,並且你在其中導入測試,那麼你最終會得到兩個版本的相同文件,這些文件都是用不同的名字加載的。如果你添加了'if __name__ =='__main__「:從測試導入MyClass ...'等它會按預期工作,因爲它正在修補你正在使用的測試類。 –
我還有一個更復雜的情況,我有my_package/src/my_file.py和my_package/tests/test.py。在這種情況下,我的一個測試使用了補丁(「src.my_file.MyClass」),但仍然無法正常工作。有沒有辦法讓我調試/記錄測試實際上正在修補的內容? – Feoggou