Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何在Python单元测试中模拟readlines()_Python 3.x_Unit Testing - Fatal编程技术网

Python 3.x 如何在Python单元测试中模拟readlines()

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

我正在尝试将单元测试写入使用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 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
了吗?你的导入是什么?在标题中mock
readlines()
,在细节中mock
open
使用
mock\u open
?我不需要像我所说的readlines那样的splitlines,其中splitlines是隐式的。我通过将语句替换为self.data=fp.read.splitlines()解决了这个问题。它的工作方式完全相同,单元测试现在也通过了