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

