在python中,使用来模拟对象
@patch('foo.bar')
def test_things(self, bar):
bar.return_value= ...
要求所有经过测试的类都使用
import foo
并且不能使用
from foo import bar
在第二种情况下,被测试的代码使用原始对象作为模拟patches names,而不是函数本身。感觉很脆。
我们如何编写适用于两种导入形式的模拟?
答案 0 :(得分:0)
简短答案:否
mock
的原理是模拟一个对象。如果您以不同的方式在代码中导入同一对象(这有点怪异),则需要为每个对象创建一个模拟。
示例:
import os
from os.path import isdir
from unittest.mock import patch
>>> with patch('os.path') as mock_os_path:
... mock_os_path.isdir.return_value = "Hello"
... mocked_res = os.path.isdir("./")
... res = path.isdir("./")
... print("mocked_res)
... print(res)
...
Hello
True
根据docs
target应该是“ package.module.ClassName”形式的字符串。导入目标并将指定的对象替换为新对象,因此目标必须可从您从其调用patch()的环境中导入。在执行装饰功能时(而不是在装饰时)导入目标。