我正在尝试重新创建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))
答案 0 :(得分:3)
我没有使用过这个库,但错误很常见。它基本上意味着你试图使用一些属性而不首先定义它。由于模拟文档中引用了call
属性,我的假设是它是由模拟库定义的(除了定义“MagicMock”之外),您需要将其导入程序才能使用。这很常见,库通常无法在单个属性中定义所有内容,您可能需要导入多个属性才能使其全部正常工作。
浏览模拟文档,我发现它确实有call
方法。因此,您还需要将call
方法导入到脚本中。将第一行更改为...
from mock import MagicMock, call
现在,您不仅要导入MagicMock属性,还要导入调用属性。