Python 3.x 如何在Python单元测试中模拟readlines()
我正在尝试将单元测试写入使用readlines从文件读取的类init:Python 3.x 如何在Python单元测试中模拟readlines(),python-3.x,unit-testing,Python 3.x,Unit Testing,我正在尝试将单元测试写入使用readlines从文件读取的类init: class Foo: def __init__(self, filename): with open(filename, "r") as fp: self.data = fp.readlines() 包括健康检查等 现在我正在尝试创建一个模拟对象,它允许我测试这里发生的事情 我试着这样做: TEST_DATA = "foo\nbar\nxyzzy\n" with patc
class Foo:
def __init__(self, filename):
with open(filename, "r") as fp:
self.data = fp.readlines()
包括健康检查等
现在我正在尝试创建一个模拟对象,它允许我测试这里发生的事情
我试着这样做:
TEST_DATA = "foo\nbar\nxyzzy\n"
with patch("my.data.class.open", mock_open(read_data=TEST_DATA), create=True)
f = Foo("somefilename")
self.assertEqual(.....)
问题是,当我查看f.data时,只有一个元素:
["foo\nbar\nxyzzy\n"]
这意味着无论发生什么,都不会被分成几行,而是被视为一行。如何在模拟数据中强制换行?这对类名不起作用
with patch("mymodule.class_name.open",
但是这可以通过直接模拟内置代码来实现,builtins.open
forpython3
@mock.patch("__builtin__.open", new_callable=mock.mock_open, read_data=TEST_DATA)
def test_open3(self, mock_open):
...
或者通过模仿module方法来实现这一点,而不使用类
def test_open(self):
with patch("mymodule.open", mock.mock_open(read_data=TEST_DATA), create=True):
...
你忘了在什么地方调用
splitlines
了吗?你的导入是什么?在标题中mockreadlines()
,在细节中mockopen
使用mock\u open
?我不需要像我所说的readlines那样的splitlines,其中splitlines是隐式的。我通过将语句替换为self.data=fp.read.splitlines()解决了这个问题。它的工作方式完全相同,单元测试现在也通过了