本文介绍了不能将ATTACH_MOCK与autospec函数模拟一起使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

库模块:

# 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的测试应如何在不丢失Autopec的情况下断言对依赖项bar1bar2调用的foo顺序和参数

PythonPython

这实际上是推荐答案中的错误。已于2019年末修复,补丁版本:

原始开机自检中的测试现在正在通过修复版本。Python3.6没有后端口,现在是security only,因此将永远保持bug。🐛

以下是相关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打的补丁。

这篇关于不能将ATTACH_MOCK与autospec函数模拟一起使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-08 04:08