3

我想使用 unittest 测试一种使用上下文管理器从文件中读取的方法:

with open(k_file, 'r') as content_file:
    content = content_file.read()

我不想在我的系统上创建一个文件,所以我想模拟它,但我目前并没有成功。我找到了 mock_open但我真的不明白我应该如何使用它并将模拟作为 content_file 在我的测试用例中提供。例如这里有这篇文章,但我不明白应该如何在不修改原始代码的情况下在测试用例中编写它。

谁能指出我正确的方向?

4

2 回答 2

8

mock_open()是要走的路;你用调用的结果修补open你的被测代码:mock_open()

mocked_open = unittest.mock.mock_open(read_data='file contents\nas needed\n')
with unittest.mock.patch('yourmodule.open', mocked_open, create=True):
    # tests calling your code; the open function will use the mocked_open object

patch()上下文管理器会将一个全局变量放入您的模块(我将其open()命名为yourmodule),绑定到mocked_open()-produced 对象。这个对象在被调用时会假装产生一个文件对象。

这个模拟文件对象唯一不会做的是迭代;您不能for line in content_file使用它,至少在当前版本的mock库中不能。请参阅自定义 unittest.mock.mock_open 以进行迭代以了解变通方法。

于 2014-09-18T15:18:17.327 回答
1

另一种方法是pyfakefs。它允许您创建假文件系统、写入和读取文件、设置权限等等,而无需接触您的真实磁盘。它还包含一个实际示例和教程,展示了如何将 pyfakefs 应用于 unittest 和 doctest。

于 2014-12-19T22:31:28.307 回答