生产文件(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