首页  >  文章  >  后端开发  >  如何使用unittest.mock模拟上下文管理器中使用的对象?

如何使用unittest.mock模拟上下文管理器中使用的对象?

DDD
DDD原创
2024-10-20 16:27:29461浏览

How to Mock Objects Used in Context Managers with unittest.mock?

如何使用unittest.mock模拟上下文管理器中使用的对象

当测试使用with语句的代码时,可以是模拟底层对象具有挑战性。让我们考虑以下示例:

def testme(filepath):
    with open(filepath) as f:
        return f.read()

要使用 unittest.mock 测试此函数,我们需要模拟 open 函数。具体方法如下:

Python 3:

  1. 修补builtins.open并使用unittest.mock中的mock_open。
  2. 使用patch作为上下文经理或装饰师。在这两种情况下,都将所需的读取数据传递给mock_open,并验证是否使用预期的参数调用了模拟文件。

Python 2:

  1. 修补 __builtin__.open 而不是builtins.open。
  2. 使用mock作为上下文管理器并像以前一样传递mock_open。

示例:

<code class="python">from unittest.mock import patch, mock_open

@patch("builtins.open", new_callable=mock_open, read_data="data")
def test_patch(mock_file):
    assert open("path/to/open").read() == "data"
    mock_file.assert_called_with("path/to/open")</code>

请记住,在 Python 3 中,patch 会将模拟对象作为参数传递给您的测试函数,而在 Python 2 中,您必须显式对模拟文件进行断言。

以上是如何使用unittest.mock模拟上下文管理器中使用的对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn