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

