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

