模拟打开python中的单元测试

fdh*_*hex 3 python unit-testing mocking python-mock

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

with open(k_file, 'r') as content_file:
    content = content_file.read()
Run Code Online (Sandbox Code Playgroud)

我不想在我的系统上创建一个文件,所以我想嘲笑它,但我现在并没有太大的成功.我发现了mock_open,但我真的不明白我应该如何使用它并在我的测试用例中将mock作为content_file提供.这里有这篇文章,但是我不明白在不修改原始代码的情况下如何在测试用例中编写这个.

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

Mar*_*ers 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
Run Code Online (Sandbox Code Playgroud)

该patch()上下文管理器将会把open()全球变成你的模块(我把它命名yourmodule),绑定到mocked_open()-produced对象.该对象将在调用时假装生成文件对象.

这个模拟文件对象唯一不会做的就是迭代; 你无法做到for line in content_file这一点,至少在当前版本的mock库中是这样.有关解决方法,请参阅自定义unittest.mock.mock_open以进行迭代.