模拟打开python中的单元测试

时间:2014-09-18 15:13:15

标签: python unit-testing mocking python-mock

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

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

我不想在我的系统上创建一个文件,所以我想嘲笑它,但我现在还没有超过。我找到了mock_open,但我并不理解我应该如何使用它并在我的测试用例中将mock作为content_file提供。这里有例如post,但我不明白在不修改原始代码的情况下如何在测试用例中编写这个。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:6)

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() context manager会将open()全局放入您的模块(我将其命名为yourmodule),绑定到mocked_open() - 生成的对象。该对象将在调用时假装生成文件对象。

这个模拟文件对象唯一不会做的就是迭代;你不能用它来for line in content_file,至少在mock库的当前版本中不行。有关解决方法,请参阅Customizing unittest.mock.mock_open for iteration

答案 1 :(得分:1)

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