保持 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'
并非完全出乎意料,因为我猜只有 PosixPath
被 pyfakefs
修补,但我自己的 class 没有修补,即使它继承自 PosixPath
].
但我希望能够在保持 pyfakefs
的功能的同时测试我的 class。从 PosixPath
继承的方法、字段等仍然由 pyfakefs
像 PosixPath
一样修补,只有我添加的属性没有修补。有什么办法吗?
这里的问题是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 的贡献者。
我用这种方式 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'
并非完全出乎意料,因为我猜只有 PosixPath
被 pyfakefs
修补,但我自己的 class 没有修补,即使它继承自 PosixPath
].
但我希望能够在保持 pyfakefs
的功能的同时测试我的 class。从 PosixPath
继承的方法、字段等仍然由 pyfakefs
像 PosixPath
一样修补,只有我添加的属性没有修补。有什么办法吗?
这里的问题是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 的贡献者。