1

我以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'

并非完全出乎意料,因为我猜,只有PosixPath. 修补了pyfakefs,而不是我自己的类,即使它继承自PosixPath.

但我希望能够在保留pyfakefs. 继承的方法、字段等PosixPath仍然按pyfakefs原样修补PosixPath,只有我添加的属性没有修补。有没有办法做到这一点?

4

1 回答 1

1

这里的问题是,它是在加载时Node派生的,而尚未打补丁,并且不会打补丁,因为打补丁是通过模块名称完成的。如果你想让它从 patched 派生,则必须在修补开始重新加载类定义。当您使用时,最好的方法可能是编写自己的夹具来执行此操作:PosixPathpathlibPosixPathpytest

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 的贡献者。

于 2021-10-07T18:22:31.393 回答