库模块:
# 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。
E AssertionError: Calls not found.
E Expected: [call.b1('arg1'), call.b2('arg2x', 'arg2y')]
E Actual: [call.b1('arg1')]
没有autospec,它可以工作。使用自动规格会破坏attach_mock
功能吗? foo
的测试应如何在对依赖项bar1
和bar2
的调用的顺序和参数上断言而不会丢失其自动说明 ?
答案 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的补丁。