【问题标题】:Asserting `mock_calls` equals expected call list断言 `mock_calls` 等于预期调用列表
【发布时间】:2013-02-24 15:45:23
【问题描述】:

我正在尝试重新创建mock_calls example,以便我可以检查预期的调用列表是否等于实际调用。但是,我收到了 NameError 异常,因为 name 'call' is not defined:

>>> 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))

【问题讨论】:

    标签: python mocking


    【解决方案1】:

    我没有使用过这个库,但是这个错误很常见。这基本上意味着您正在尝试使用某些属性而没有先定义它。由于模拟文档中引用了call 属性,我的假设是它是由模拟库定义的(除了定义“MagicMock”),您需要将其导入程序才能使用。这很常见,库通常不能在单个属性中定义所有内容,您可能需要导入多个属性才能使其全部正常工作。

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

    from mock import MagicMock, call
    

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

    【讨论】:

    • 谢谢!我也试过找call的方法,累了也没找到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2018-04-05
    相关资源
    最近更新 更多