【问题标题】:mock open for unit testing in python在 python 中模拟打开单元测试
【发布时间】:2014-11-13 00:24:32
【问题描述】:

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

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

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

谁能指出我正确的方向?

【问题讨论】:

    标签: python unit-testing mocking python-mock


    【解决方案1】:

    mock_open() 是要走的路;你用mock_open()调用的结果在你的代码中修补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 了解解决方法。

    【讨论】:

    • 谢谢!我不知道在哪里调用我的模块,但现在它可以工作了。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-01-29
      • 1970-01-01
      • 2019-12-13
      • 2022-11-29
      • 2021-12-02
      • 2016-08-20
      • 1970-01-01
      • 2017-11-15
      • 2019-05-15
      相关资源
      最近更新 更多