不幸mock_open
的是不支持部分读取,而且您使用 python 2.7(我假设它是因为您编写MagicMock(spec=file)
)并且mock_open
非常有限。
我们可以概括您的问题,例如我们可以写出side_effect
可以保持状态的内容。在 python 中有一些方法可以做到这一点,但恕我直言,最简单的是使用一个实现的类__call__
(这里不能使用生成器,因为mock
解释生成器就像副作用列表一样):
from mock import MagicMock
class my_read_side_effect():
def __init__(self,data=""):
self._data = data
def __call__(self, l=0): #That make my_read_side_effect a callable
if not self._data:
return ""
if not l:
l = len(self._data)
r, self._data = self._data[:l], self._data[l:]
return r
mock_file = MagicMock(spec=file)
mock_file.read.side_effect = my_read_side_effect("abcdefghijklmnopqrs")
assert "abcdef" == mock_file.read(6)
assert "ghijklm" == mock_file.read(7)
assert "nopqrs" == mock_file.read()
此外,我们可以在处理程序中注入该实现mock_open
以修补mock_open.read()
方法。
from mock patch, mock_open
with patch("__builtin__.open", new_callable=mock_open) as mo:
mock_file = mo.return_value
mock_file.read.side_effect = my_read_side_effect("abcdefghijklmnopqrs")
assert "abcdef" == mock_file.read(6)
assert "ghijklm" == mock_file.read(7)
assert "nopqrs" == mock_file.read()
这为您提供了一种在测试中使用它的简单方法,其中文件在函数中打开并且不作为参数传递。