【发布时间】:2019-05-29 19:46:51
【问题描述】:
库模块:
# 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 它可以工作。使用 autospec 会破坏attach_mock 功能吗? foo 的测试应该如何断言对依赖项 bar1 和 bar2 的调用的顺序和参数不丢失它们的自动规范?
【问题讨论】:
-
嗯,看起来
mocker.patch("mod.bar2", autospec=True)根本没有修补这个功能 - 你能检查一下吗? -
@hoefling 你为什么这么说?它确实模拟了它 - 但自动规范使模拟看起来比平时更像原始模型。如果您想说服自己,请在
bar2的正文中添加1/0。
标签: python testing mocking pytest pytest-mock