Python单元测试Mock pathlib.Path遇错及pathlib3x适配问题
解决Python单元测试Mock pathlib.Path的问题
原问题分析
直接mock pathlib.Path 类并给类本身设置is_file/exists的返回值,会触发两个问题:
- 报错
AttributeError: type object 'Path' has no attribute '_flavour':Mock的Path类缺少Path实例初始化时依赖的内部属性_flavour,代码中p = Path(...)创建实例时会触发这些未被Mock的内部逻辑。 - 方法返回值不生效:
is_file和exists是Path实例的方法,不是类方法,直接给Mock的类设置返回值不会作用到创建的实例上。
正确的Mock方式
针对pathlib.Path的修正
修改测试代码,给Mock的Path实例设置方法返回值,而非类本身:
@patch('pathlib.Path') def test_start(self, patch_path): # 获取Path()调用返回的实例Mock对象 mock_path_instance = patch_path.return_value # 给实例的方法设置预期返回值 mock_path_instance.exists.return_value = True mock_path_instance.is_file.return_value = True x = functionX() self.assertTrue(x)
关键注意点
- Patch目标要精准:如果
functionX所在模块是通过from pathlib import Path导入的类,那么Patch路径应该是'your_module_name.Path'(替换为functionX所在的实际模块名),而非'pathlib.Path',这样才能Mock到functionX实际使用的Path类。
pathlib3x的适配方案
改用pathlib3x后方法返回值不生效,同样遵循上述逻辑调整:
- 确认Patch目标是
functionX中导入的Path(比如functionX里是from pathlib3x import Path,则Patch路径为'your_module_name.Path') - 给Mock的实例设置方法返回值,示例代码:
@patch('your_module_name.Path') def test_start(self, patch_path): mock_path_instance = patch_path.return_value mock_path_instance.exists.return_value = True mock_path_instance.is_file.return_value = True x = functionX() self.assertTrue(x)
内容的提问来源于stack exchange,提问作者Chief
相关产品推荐
相关产品推荐

