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

如何用pytest-mocker将模块变量Mock为Path对象而非MagicMock?

解决pytest-mocker Mock模块变量返回MagicMock而非目标对象的问题

当你用mocker.patch替换模块变量时,错误使用return_value会导致目标变量被替换成MagicMock对象,而非你需要的Path实例——因为return_value是用来设置Mock函数被调用时的返回值,而不是直接替换变量本身。

正确的做法是使用new参数直接将变量替换为目标Path对象:

@pytest.fixture(autouse=True)
def mock_default(mocker, tmp_path):
    """Mock Default Config File Path."""
    mocker.patch("mypackage.mymodule.DEFAULT", new=tmp_path / "myfile")

为什么之前的写法不行?

mocker.patch("mypackage.mymodule.DEFAULT")默认会把DEFAULT替换成一个MagicMock实例,你设置的return_value只是这个Mock被当作函数调用时的返回值(比如DEFAULT()会返回Path),但直接调用DEFAULT.touch()时,其实是在调用Mock对象的touch方法,而非真实Path对象的方法,自然不会创建文件。

用new参数后,DEFAULT会被直接替换成你传入的tmp_path / "myfile"这个真实的Path对象,调用它的touch方法就能正常创建文件了。

如果需要兼容旧版本的pytest-mocker(或者更灵活的场景),也可以用side_effect设置为目标对象,但new是最直接的方式:

# 替代写法(不推荐,仅作参考)
mocker.patch("mypackage.mymodule.DEFAULT", side_effect=lambda: tmp_path / "myfile")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:15:18