保持 pathlib.(Posix)Path 在子类化时由 pyfakefs 修补

Keep pathlib.(Posix)Path patched by pyfakefs when subclassing it

我用这种方式 classed PosixPath:

from pathlib import PosixPath


class Node(PosixPath):

    def __new__(cls, *args, mykwarg=None, **kwargs):
        self = super().__new__(cls, *args, **kwargs)
        self._mykwarg = mykwarg
        return self

并添加了几个 @property 方法。

现在如果我想测试一下(我用pytest),它不起作用:

def test_Node(fs):
    fs.create_file('simple.txt')
    n = Node('simple.txt')
    n.stat()

运行 测试输出(第 n.stat() 行):

E   FileNotFoundError: [Errno 2] No such file or directory: 'simple.txt'

并非完全出乎意料,因为我猜只有 PosixPathpyfakefs 修补,但我自己的 class 没有修补,即使它继承自 PosixPath ].

但我希望能够在保持 pyfakefs 的功能的同时测试我的 class。从 PosixPath 继承的方法、字段等仍然由 pyfakefsPosixPath 一样修补,只有我添加的属性没有修补。有什么办法吗?

这里的问题是Node是加载时从PosixPath导出的,而pathlib还没有打补丁,不会打补丁,因为打补丁是由模块完成的姓名。如果你想让它从打补丁的 PosixPath 派生,class 定义必须在 打补丁开始后 重新加载。当您使用 pytest 时,最好的方法可能是编写您自己的固定装置来执行此操作:

import pytest
from pyfakefs.fake_filesystem_unittest import Patcher
import node  # assuming Node lives in node.py

@pytest.fixture
def my_fs():
    with Patcher(modules_to_reload=[node]) as p:
        yield p.fs

def test_Node(my_fs):
    ...

modules_to_reload 参数正是针对此类问题。

免责声明:我是 pyfakefs 的贡献者。