
该
mock_open()对象确实不实现迭代。
如果未将文件对象用作上下文管理器,则可以使用:
m = unittest.mock.MagicMock(name='open', spec=open)m.return_value = iter(self.TEST_TEXT)with unittest.mock.patch('builtins.open', m):现在
open()返回一个迭代器,可以像文件对象一样直接对其进行迭代,并且还可以使用
next()。但是,它不能用作上下文管理器。
您可以将其与结合起来,
mock_open()然后在返回值上提供
__iter__and
__next__方法,并获得额外的好处,这
mock_open()也增加了用作上下文管理器的先决条件:
# Note: read_data must be a string!m = unittest.mock.mock_open(read_data=''.join(self.TEST_TEXT))m.return_value.__iter__ = lambda self: selfm.return_value.__next__ = lambda self: next(iter(self.readline, ''))
这里的返回值是
MagicMock从
file对象(Python
2)或内存文件对象(Python 3)中指定的对象,但是只有
read,
write和
__enter__方法已存入。
上述方法不工作在Python 2,因为一个)的Python
2预计
next存在,不
__next__和b)
next不被视为在模拟(这是正确的)的特殊方法,所以即使你重新命名
__next__以
next在上述示例中的
类型 的返回值将没有
next方法。在 大多数 情况下,使文件对象产生 可迭代的, 而不是使用以下代码进行迭代就足够了:
# Python 2!m = mock.mock_open(read_data=''.join(self.TEST_TEXT))m.return_value.__iter__ = lambda self: iter(self.readline, '')
iter(fileobj)然后,任何使用的代码都将起作用(包括
for循环)。
Python跟踪器中存在一个开放的问题,旨在弥补这一差距。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)