gpt4 book ai didi

python - 使用大小变量的模拟文件读取方法

转载 作者:行者123 更新时间:2023-11-30 23:15:17 25 4
gpt4 key购买 nike

我正在尝试使用 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

但是,我还没有弄清楚如何将读取器的当前位置存储在 side_effect 函数中,以便在之后读取。我认为也许有更好的方法,但我仍然没有弄清楚。

最佳答案

不幸的是 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()

此外,我们可以将该实现注入(inject) 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 - 使用大小变量的模拟文件读取方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28297925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com