You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python单元测试中如何针对特定文件路径mock open函数

单元测试中针对特定路径mock open及参数校验方案

方案1:仅对指定路径的open调用执行mock

你可以通过自定义side_effect实现仅拦截目标路径的open请求,其余路径走原生open逻辑,示例代码如下:

from unittest import mock

# 配置要mock的目标路径和模拟返回数据
TARGET_FILE_PATH = "file_path"
MOCK_JSON_DATA = '{"code": 0, "data": "test"}'

# 保留原生open函数,用于非目标路径的正常打开逻辑
original_open = open

def mock_open_specific_path(file_path, *args, **kwargs):
    if file_path == TARGET_FILE_PATH:
        # 匹配到目标路径时返回mock的文件对象
        return mock.mock_open(read_data=MOCK_JSON_DATA).return_value
    # 非目标路径调用原生open
    return original_open(file_path, *args, **kwargs)

# 测试时patch open的side_effect为自定义函数
with mock.patch("builtins.open", side_effect=mock_open_specific_path):
    # 此处执行你的测试代码即可
    ...

如果你需要匹配更复杂的规则(比如路径前缀、通配符匹配),修改自定义函数里的判断逻辑即可。

方案2:校验open调用时传入的路径是否正确

如果你不需要区分路径做差异化mock,只需要验证业务代码是否调用了正确的文件路径,直接校验mock对象的调用参数即可:

from unittest import mock

MOCK_JSON_DATA = '{"code": 0, "data": "test"}'
test_mock_open = mock.mock_open(read_data=MOCK_JSON_DATA)

with mock.patch("builtins.open", test_mock_open):
    # 执行你的业务代码,比如被测试的函数
    your_business_func()

# 校验open被调用时的路径和打开模式符合预期,仅校验路径可以忽略第二个参数
test_mock_open.assert_called_once_with("file_path", "r")

# 如果业务代码中会多次调用open,用以下方法校验目标路径的调用存在即可
# test_mock_open.assert_any_call("file_path", "r")

内容的提问来源于stack exchange,提问作者Jed Godsey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:24:04