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

Pytest mocker无法找到Path,如何正确Mock Path.is_file()?

如何正确Mock Path.is_file()方法

问题场景

维护他人编写的测试代码时,因底层逻辑修改,需要让Path().is_file()返回True,尝试的Mock代码报错:

from pathlib import Path
@pytest.fixture(scope="function")
def mock_is_file(mocker):
    mocker.patch('Path.is_file')
    return True

错误信息:

E       ModuleNotFoundError: No module named 'Path'

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/unittest/mock.py:1161: ModuleNotFoundError

问题根源

mocker.patch需要传入完整的模块路径来定位要Mock的对象。直接写'Path.is_file'会被解析为寻找名为Path的模块,而不是pathlib下的Path类,因此触发找不到模块的错误。

正确解决方案

方法1:直接Mock pathlib.Path的is_file方法

修改fixture,指定完整路径并设置返回值:

from pathlib import Path
import pytest

@pytest.fixture(scope="function")
def mock_is_file(mocker):
    # 用完整模块路径定位Path.is_file,设置返回值为True
    mock_obj = mocker.patch('pathlib.Path.is_file')
    mock_obj.return_value = True
    return mock_obj

方法2:Mock被测试代码中导入的Path(更推荐)

如果你的被测试代码是通过from pathlib import Path导入的,更推荐Mock被测试模块中的Path对象,避免污染全局的pathlib.Path:

# 假设被测试模块名为my_module.py
# my_module.py中的代码:
from pathlib import Path

def validate_file(path):
    return Path(path).is_file()

对应的测试代码:

import pytest
from my_module import validate_file

@pytest.fixture(scope="function")
def mock_is_file(mocker):
    # Mock my_module模块中的Path.is_file
    mock_obj = mocker.patch('my_module.Path.is_file')
    mock_obj.return_value = True
    return mock_obj

def test_validate_file(mock_is_file):
    assert validate_file("any_path.txt") is True

这样Mock只会影响被测试模块中的Path使用,不会干扰其他测试用例中的pathlib.Path行为。

内容的提问来源于stack exchange,提问作者Greg Dougherty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:40:24