断言 `mock_calls` 等于期望的调用列表。

3
我正尝试重新创建mock_calls示例,以便检查预期的调用列表是否等于实际调用。然而,我收到了一个NameError异常,因为名称 'call' 未定义:
>>> from mock import MagicMock
>>> mock = MagicMock()
>>> result = mock(1, 2, 3)
>>> mock.first(a=3)
<MagicMock name='mock.first()' id='47645192'>
>>> mock.second()
<MagicMock name='mock.second()' id='47653440'>
>>> int(mock)
1
>>> result(1)
<MagicMock name='mock()()' id='47666064'>
>>> expected = [call(1, 2, 3), call.first(a=3), call.second(), call.__int__(), call()(1)]

Traceback (most recent call last):
  File "<pyshell#39>", line 1, in <module>
    expected = [call(1, 2, 3), call.first(a=3), call.second(), call.__int__(), call()(1)]
NameError: name 'call' is not defined

我尝试将expected变量定义为字符串,但是这仍然不允许直接比较。

>>> expected = """[call(1, 2, 3), call.first(a=3), call.second(), call.__int__(), call()(1)]"""
>>> mock.mock_calls == expected
False
>>> mock.mock_calls
[call(1, 2, 3), call.first(a=3), call.second(), call.__int__(), call()(1)]

您对如何使这个示例工作有什么想法吗?如果有,那么正确的方法是检查mock_calls是否具有预期的调用列表,并且顺序相同吗?

编辑:

这里是_CallList类的源代码,它是由mock_calls属性返回的对象类型。

class _CallList(list):

    def __contains__(self, value):
        if not isinstance(value, list):
            return list.__contains__(self, value)
        len_value = len(value)
        len_self = len(self)
        if len_value > len_self:
            return False

        for i in range(0, len_self - len_value + 1):
            sub_list = self[i:i+len_value]
            if sub_list == value:
                return True
        return False

    def __repr__(self):
        return pprint.pformat(list(self))
1个回答

5

我没有使用过这个库,但是这个错误非常常见。它基本上意味着你正在尝试使用一些没有先定义的属性。既然在模拟文档中引用了call属性,那么我的假设是它是由模拟库定义的(除了定义"MagicMock")你需要导入到程序中才能使用的东西。这是相当普遍的情况,一个库通常不能在单个属性中定义所有内容,你可能需要导入多个属性来使其正常工作。

浏览模拟文档,我发现它确实有一个call方法。因此,你还需要将call方法导入你的脚本中。将第一行改为...

from mock import MagicMock, call

现在,您不仅导入了MagicMock属性,还导入了call属性。

谢谢!我也试图寻找call方法,但由于疲劳无法找到它。 - Wesley Baugh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接