python - 如何模拟在 with 语句中使用的 open (使用 Python 中的 Mock

如何使用 unittest.mock 测试以下代码:

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

最佳答案

Python 3

补丁 builtins.open并使用 mock_open ,它是 mock 的一部分框架。 patch用作 context manager返回用于替换修补对象的对象:

from unittest.mock import patch, mock_open
with patch("builtins.open", mock_open(read_data="data")) as mock_file:
    assert open("path/to/open").read() == "data"
mock_file.assert_called_with("path/to/open")

如果你想使用 patch 作为装饰器,使用 mock_open() 的结果作为 new= 参数到 补丁 可能有点奇怪。相反,使用 patchnew_callable= 参数并记住 patch 不使用的每个额外参数都将传递给 new_callable 函数,如 patch documentation 中所述:

patch() takes arbitrary keyword arguments. These will be passed to the Mock (or new_callable) on construction.

@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")

请记住,在这种情况下,patch 会将模拟对象作为参数传递给您的测试函数。

Python 2

您需要修补 __builtin__.open 而不是 builtins.open 并且 mock 不是 unittest 的一部分,需要pip install单独导入:

from mock import patch, mock_open
with patch("__builtin__.open", mock_open(read_data="data")) as mock_file:
    assert open("path/to/open").read() == "data"
mock_file.assert_called_with("path/to/open")

关于python - 如何模拟在 with 语句中使用的 open (使用 Python 中的 Mock 框架)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1289894/

相关文章:

linux - 如何将命令存储在 shell 脚本的变量中?

python - 如何在 Python Django 中运行单元测试时禁用日志记录?

python - 如何将整数时间戳转换为日期时间

linux - Bash 中的脚本参数

linux - 如何为安装程序编写 "yes"响应脚本?

linux - 有没有办法改变 Unix 中另一个进程的环境变量?

c - Linux:是否有超时的套接字读取或接收?

asp.net - 在基于 Linux 的服务器上运行 ASP.Net

Python - doctest 与 unittest

python - 在 Python 中注释函数的正确方法是什么?