模拟for循环中的open/file

2024-05-05 10:54:17 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑模拟返回文件对象的打开调用

>>> 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_fi.mock_calls
[]
>>> mock_op.mock_calls
[call()]

这也很好。现在考虑在文件中的行上循环

>>> for l in mock_fi:
...     break
... 
>>> mock_fi.mock_calls
[call.__iter__()]

这是意料之中的。我不明白的是为什么mock\u op对象也记录了一个__iter__调用

>>> mock_op.mock_calls
[call(), call().__iter__()]

Tags: 文件对象fromimportreturnvalueunittestcall
1条回答
网友
1楼 · 发布于 2024-05-05 10:54:17

根据文档,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__()的调用

相关问题 更多 >