不能使用attach_mock和自动规格函数mock。

问题描述 投票:2回答:1

库模块。

# 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是否会破坏 attach_mock 功能?应该如何测试 foo 主张 顺序和数组 的调用的依赖性 bar1bar2 而又不失其自变量?

python testing mocking pytest pytest-mock
1个回答
0
投票

这其实是Python中的一个bug。在2019年底,打了补丁的版本中得到了修复。

原帖中的测试现在已经通过了固定版本。Python 3.6没有回传,这是 唯恐 现在这样将永远保持bug。 🐛

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

BPO-21478: Autospec函数应该将模拟调用传播给父函数。

BPO-21478: 当使用autospecced对象作为子对象时,记录对父对象的调用。attach_mock

BPO-38473: 处理自动指定的函数和方法,与 attach_mock

补丁由Karthikeyan Singaravelan。

© www.soinside.com 2019 - 2024. All rights reserved.