考虑模拟一个返回文件对象的open调用
>>> from unittest.mock import MagicMock
>>> mock_fi = MagicMock()
>>> mock_op = MagicMock()
>>> mock_op.return_value = mock_file
>>>
>>> f = mock_op()
>>> f is mock_fi
True
到目前一切尚好。mock_calls的内容是
>>> mock_fi.mock_calls
[]
>>> mock_op.mock_calls
[call()]
这也很好。现在考虑循环遍历文件中的各行
>>> for l in mock_fi:
... break
...
>>> mock_fi.mock_calls
[call.__iter__()]
这和预期的一样。我不明白的是,为什么mock_op对象也记录了一个__iter__
调用
>>> mock_op.mock_calls
[call(), call().__iter__()]
发布于 2017-04-29 15:21:02
根据文档,mock_calls记录了对对象的所有调用,以及对该对象的调用返回的对象的所有调用。
例如:
>>> my_mock = MagicMock()
>>> my_mock.foo().bar()
<MagicMock name='mock.foo().bar()' id='140397146563528'>
>>> my_mock.mock_calls
[call.foo(), call.foo().bar()] # bar() was not called directly on my_mock,
# yet, it is included since it was called on
# the return value of foo() which is a direct
# access to my_mock
在原始代码中,mock_op.mock_calls
报告call().__iter__()
,这是对mock_fi
上的__iter__()
的调用。
https://stackoverflow.com/questions/43692791
复制相似问题