因此,由于上下文管理器,我正在努力模拟这个函数。
待测函数
import fitz
def with_test_func(next_pdfs_path):
text = ''
with fitz.open(next_pdfs_path) as doc:
text = doc
return text
测试代码
@mock.patch("content_production.fitz.open.__enter__", return_value='value_out')
def test_with_test_func(mock_fitz_open):
assert cp.with_test_func('value_in') == 'value_out'
误差RuntimeError: cannot open value_in: No such file or directory
我在没有上下文管理器的情况下进行了测试,它可以工作。那么我该如何解决这个问题呢?由于
编辑
所以按照@MrBean的建议,我尝试了这个
@mock.patch("content_production.fitz.open.return_value.__enter__", return_value='value_out')
def test_with_test_func(mock_fitz_open):
assert cp.with_test_func('value_in') == 'value_out'
它给了我这个错误
thing = <class 'fitz.fitz.Document'>, comp = 'return_value', import_path = 'content_production.fitz.open.return_value'
def _dot_lookup(thing, comp, import_path):
try:
return getattr(thing, comp)
except AttributeError:
> __import__(import_path)
E ModuleNotFoundError: No module named 'content_production.fitz'; 'content_production' is not a package
问题是return_value
是mock的属性,而不是补丁函数的属性,因此您不能将其放入patch
参数字符串中。相反,您必须为open
方法在模拟上设置返回值:
@mock.patch("content_production.fitz.open")
def test_with_test_func(mock_fitz_open):
mock_fitz_open.return_value.__enter__.return_value = 'value_out'
assert cp.with_test_func('value_in') == 'value_out'