库模块:
# 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
。使用执行MCVEpython -m pytest
。
E AssertionError: Calls not found.
E Expected: [call.b1('arg1'), call.b2('arg2x', 'arg2y')]
E Actual: [call.b1('arg1')]
没有autospec它可以工作。使用 autospec 会破坏该attach_mock
功能吗?应该如何在不丢失它们的 autospec 的情况下对依赖调用的 order和argsfoo
进行assert测试?bar1
bar2