无法将attach_mock与自动规格函数嘲笑

时间:2019-05-29 19:46:52

标签: python testing mocking pytest pytest-mock

库模块:

# mod.py
def foo():
    bar1("arg1")
    bar2("arg2x", "arg2y")

def bar1(x):
    pass

def bar2(x, y):
    pass

测试模块:

# test_mod.py
from mod import foo

def test_foo(mocker):
    mock = mocker.MagicMock()
    mock.attach_mock(mocker.patch("mod.bar1"), "b1")
    mock.attach_mock(mocker.patch("mod.bar2", autospec=True), "b2")
    foo()
    mock.assert_has_calls(
        [
            mocker.call.b1("arg1"),
            mocker.call.b2("arg2x", "arg2y"),
        ]
    )

mocker固定装置来自pytest-mock插件。用python -m pytest执行MCVE

weird reasons的测试失败。

E       AssertionError: Calls not found.
E       Expected: [call.b1('arg1'), call.b2('arg2x', 'arg2y')]
E       Actual: [call.b1('arg1')]

没有autospec,它可以工作。使用自动规格会破坏attach_mock功能吗? foo的测试应如何在对依赖项bar1bar2 的调用的顺序和参数上断言而不会丢失其自动说明

1 个答案:

答案 0 :(得分:1)

这实际上是Python中的错误。它已在2019年末修复,已修补版本:

原始帖子中的测试现在通过固定版本。现在没有security only的Python 3.6的反向移植,因此将永远存在bug。 ?

以下是相关的PR和问题跟踪链接:

bpo-21478 Autospec functions should propagate mock calls to parent

bpo-21478 Record calls to parent when autospecced objects are used as child with attach_mock

bpo-38473 Handle autospecced functions and methods used with attach_mock

Karthikeyan Singaravelan的补丁。