使用大小变量的模拟文件读取方法
Mock file read method using size variable
我正在尝试使用 python 模拟库模拟一个文件。虽然很简单,但我仍然不明白如何在必须接收大小参数时模拟读取函数。我试图使用 side_effect 创建一个替代函数,该函数将读取作为值传递的足够数据。
想法是这样的:
def mock_read(value):
test_string = "abcdefghijklmnopqrs"
'''
Now it should read enough values from the test string, but
I haven't figured out a way to store the position where the
"read" method has stopped.
'''
mock_file = MagicMock(spec=file)
mock_file.read.side_effect = mock_read
但是,我还没有弄清楚如何将reader的当前位置存储在side_effect函数中,稍后再阅读。我认为也许有更好的方法,但我仍然想通了。
不幸的是 mock_open
不支持部分读取,而且你使用 python 2.7(我假设它是因为你写 MagicMock(spec=file)
)并且 mock_open
非常有限。
我们可以概括您的问题,例如 我们可以编写 side_effect
来保持状态 。在 python 中有一些方法可以做到这一点,但恕我直言,最简单的方法是使用实现 __call__
的 class (生成器不能在这里使用,因为 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()
这为您提供了一种在测试中使用它的简单方法,其中文件在函数中打开且未作为参数传递。
我正在尝试使用 python 模拟库模拟一个文件。虽然很简单,但我仍然不明白如何在必须接收大小参数时模拟读取函数。我试图使用 side_effect 创建一个替代函数,该函数将读取作为值传递的足够数据。
想法是这样的:
def mock_read(value):
test_string = "abcdefghijklmnopqrs"
'''
Now it should read enough values from the test string, but
I haven't figured out a way to store the position where the
"read" method has stopped.
'''
mock_file = MagicMock(spec=file)
mock_file.read.side_effect = mock_read
但是,我还没有弄清楚如何将reader的当前位置存储在side_effect函数中,稍后再阅读。我认为也许有更好的方法,但我仍然想通了。
不幸的是 mock_open
不支持部分读取,而且你使用 python 2.7(我假设它是因为你写 MagicMock(spec=file)
)并且 mock_open
非常有限。
我们可以概括您的问题,例如 我们可以编写 side_effect
来保持状态 。在 python 中有一些方法可以做到这一点,但恕我直言,最简单的方法是使用实现 __call__
的 class (生成器不能在这里使用,因为 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()
这为您提供了一种在测试中使用它的简单方法,其中文件在函数中打开且未作为参数传递。