自定义unittest.mock.mock_open以进行迭代

自定义unittest.mock.mock_open以进行迭代,第1张

自定义unittest.mock.mock_open以进行迭代

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跟踪器中存在一个开放的问题,旨在弥补这一差距。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5623870.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-15
下一篇2022-12-15

发表评论

登录后才能评论

评论列表(0条)

    保存