首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在for循环中模拟open/file

在for循环中模拟open/file
EN

Stack Overflow用户
提问于 2017-04-29 15:04:15
回答 1查看 35关注 0票数 1

考虑模拟一个返回文件对象的open调用

代码语言:javascript
运行
复制
>>> 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的内容是

代码语言:javascript
运行
复制
>>> mock_fi.mock_calls
[]
>>> mock_op.mock_calls
[call()]

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

代码语言:javascript
运行
复制
>>> for l in mock_fi:
...     break
... 
>>> mock_fi.mock_calls
[call.__iter__()]

这和预期的一样。我不明白的是,为什么mock_op对象也记录了一个__iter__调用

代码语言:javascript
运行
复制
>>> mock_op.mock_calls
[call(), call().__iter__()]
EN

回答 1

Stack Overflow用户

发布于 2017-04-29 15:21:02

根据文档,mock_calls记录了对对象的所有调用,以及对该对象的调用返回的对象的所有调用。

例如:

代码语言:javascript
运行
复制
>>> 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__()的调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43692791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档