【问题标题】:Cannot use attach_mock with an autospec function mock不能将 attach_mock 与 autospec 函数模拟一起使用
【发布时间】: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

weirdreasons 的此测试失败。

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

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

【问题讨论】:

  • 嗯,看起来 mocker.patch("mod.bar2", autospec=True) 根本没有修补这个功能 - 你能检查一下吗?
  • @hoefling 你为什么这么说?它确实模拟了它 - 但自动规范使模拟看起来比平时更像原始模型。如果您想说服自己,请在 bar2 的正文中添加 1/0

标签: python testing mocking pytest pytest-mock


【解决方案1】:

这实际上是 Python 中的一个错误。它在 2019 年末得到修复,补丁版本:

原帖中的测试现在通过了一个固定版本。 Python 3.6 没有反向移植,现在是security only,所以将永远存在错误。 ?

这些是相关的 PR 和问题跟踪链接:

bpo-21478Autospec functions should propagate mock calls to parent

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

bpo-38473Handle autospecced functions and methods used with attach_mock

Karthikeyan Singaravelan 的补丁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多