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
相关产品推荐
相关产品推荐

