Pytest使用decorator模拟包含未传递的上下文管理器返回值的函数



因此,由于上下文管理器,我正在努力模拟这个函数。

待测函数

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'

相关内容

  • 没有找到相关文章

最新更新