我想使用unittest测试一个使用上下文管理器从文件读取的方法:
with open(k_file, 'r') as content_file:
content = content_file.read()
我不想在我的系统上创建一个文件,所以我想嘲笑它,但我现在还没有超过。我找到了mock_open,但我并不理解我应该如何使用它并在我的测试用例中将mock作为content_file提供。这里有例如post,但我不明白在不修改原始代码的情况下如何在测试用例中编写这个。
有人能指出我正确的方向吗?
答案 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。