Pytest 适用于旧的模拟,但不适用于 unittest.mock

2024-04-21

我正在将一些代码从 Python 2 移植到 3,并且py.test玩得不好patch装饰器来自unittest.mock。当我使用patch装饰器将模拟传递到测试函数的参数中,py.test相反,将该参数解释为固定装置,并且无法设置测试。

这是一个人为的例子,希望能够阐明这个问题:

@patch('my_module.my_func')
def test_my_func(mock_func):
    mock_func()
    mock_func.assert_called_once_with()

运行后py.test,错误消息将如下所示:

E       fixture 'my_func' not found
>       available fixtures: cache, capfd, capsys, doctest_namespace, monkeypatch, pytestconfig, record_xml_property, recwarn, tmpdir, tmpdir_factory
>       use 'pytest --fixtures [testpath]' for help on them.

这是发生此故障的唯一情况。如果我明确调用测试(即运行test_my_func()),没有错误。如果我打补丁my_func使用其他任何一种修补技术都没有错误。如果我从以下位置导入补丁mock代替unittest.mock,没有错误。

仅在使用运行我的测试时py.test, using unittest.mock,并在发生这种情况时使用装饰器进行修补。

我正在运行Python 3.4.5。


是的,不支持模拟装饰器。 这并没有那么糟糕——通过装饰器设备更改函数签名被认为是坏主意。 但你仍然可以使用with mock.patch(...) syntax.

另外还有一个选项pytest 模拟 https://pypi.python.org/pypi/pytest-mock带有非常干净的 api 的插件用于模拟:

def test_foo(mocker):
    # all valid calls
    mocker.patch('os.remove')
    mocker.patch.object(os, 'listdir', autospec=True)
    mocked_isfile = mocker.patch('os.path.isfile')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pytest 适用于旧的模拟,但不适用于 unittest.mock 的相关文章

随机推荐