继承pathlib.PosixPath的自定义类如何使用pyfakefs正常完成测试
问题根因
问题的根因确实是pyfakefs默认仅对原生的PosixPath/Path类做了方法补丁,自定义子类不在默认适配范围内,调用继承自原生类的IO相关方法时会直接访问真实文件系统,导致找不到测试用的模拟文件。
解决方案
pyfakefs 提供了官方API add_pathlib_cls 用于注册自定义的Path子类,注册后所有子类实例继承自原生Path的方法都会走fake文件系统逻辑,自定义的属性和方法不受影响,完全符合你的需求。
方案1:单测试用例内注册
仅当前测试用例需要用到Node类时,直接在测试内注册即可:
def test_Node(fs): # 先注册自定义Node类到pyfakefs适配列表 fs.add_pathlib_cls(Node) fs.create_file('simple.txt') n = Node('simple.txt') n.stat() # 执行正常
方案2:全局fixture统一注册
如果多个测试用例都需要用到Node类的测试,可以封装独立fixture避免重复注册:
import pytest # 替换为你自己的Node类导入路径 from your_module import Node @pytest.fixture def fs_with_node(fs): fs.add_pathlib_cls(Node) yield fs
后续测试直接使用该fixture即可:
def test_Node(fs_with_node): fs_with_node.create_file('simple.txt') n = Node('simple.txt') assert n._mykwarg is None # 自定义属性不受影响 n.stat()
内容的提问来源于stack exchange,提问作者zezollo
相关产品推荐
相关产品推荐

