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

如何使用pyfakefs mock类中的pathlib.Path类型类变量?

pyfakefs 正确 Mock 类中的 Path 类型类变量

问题根源

类变量FILE_PATH在模块首次导入时就已经通过真实的pathlib.Path完成初始化,后续使用Patcher重载模块时,已创建的MyClass不会自动重新初始化类变量,导致Mock失效。

解决方案

方案一:在 Patcher 上下文内重新导入模块

在Patcher生效的环境中重新导入目标模块,让类变量使用fake的Path重新初始化:

from pyfakefs.fake_filesystem_unittest import Patcher
from pyfakefs.fake_pathlib import FakePathlibModule

def test_class_variable():
    with Patcher():
        # 确保在patcher生效后重新导入模块
        from . import my_class
        assert type(my_class.MyClass.FILE_PATH) is FakePathlibModule.PosixPath

方案二:手动重置类变量

如果受测试架构限制无法重新导入模块,可在Patcher生效后手动为类变量赋值fake的Path实例:

from pathlib import Path
from pyfakefs.fake_filesystem_unittest import Patcher
from pyfakefs.fake_pathlib import FakePathlibModule

from . import my_class

def test_class_variable():
    with Patcher():
        # 用fake的Path覆盖原有类变量
        my_class.MyClass.FILE_PATH = Path('/etc/ids.json')
        assert type(my_class.MyClass.FILE_PATH) is FakePathlibModule.PosixPath

原代码失效原因

你原代码中使用modules_to_reload=[my_class],但reload操作仅会更新模块内的顶层对象,不会重新定义已创建的MyClass类——类变量的初始化逻辑在类首次定义时就已执行,reload无法触发重新初始化,因此类变量仍指向真实的Path实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:53:23