我有一个类型为pathlib.Path的类变量.

from pathlib import Path


class MyClass:
    FILE_PATH = Path('/etc/ids.json')

我知道pyfakefs不能自动嘲笑这一点.因此,在我的测试中,我使用它的Patcher类(我还try 了其他方法)来重新加载相应的模块.

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(fs):
    # my_class.MyClass.FILE_PATH = Path('/etc/ids.json')
    with Patcher(modules_to_reload=[my_class]):
        assert type(my_class.MyClass.FILE_PATH) is FakePathlibModule.PosixPath

但它仍然没有被嘲笑.

如果我取消对注释行的注释,则测试成功.

我应该怎么做才能模拟类变量?

推荐答案

这里的问题是,您创建了两次补丁程序:一次是通过fs装置,另一次是通过Patcher实例化手动创建的.

pyfakefs不支持嵌套的文件系统模拟--在嵌套的情况下,它只使用现有的文件系统模拟.这在某种程度上被描述为in the caution about module- and session-scoped fixtures,但可能需要在文档中放在更突出的位置,因为这是独立于模块或会话范围的装置的使用而存在的.

解决此问题的最简单方法是省略此处的fs个灯具:

def test_class_variable():
    with Patcher(modules_to_reload=[my_class]):
        assert type(my_class.MyClass.FILE_PATH) is FakePathlibModule.PosixPath

如果您不止一次需要这样做(或者如果您不想在测试本身中使用该设置),则可以创建您自己的装置:

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


def test_class_variable(my_fs):
    assert type(my_class.MyClass.FILE_PATH) is FakePathlibModule.PosixPath

Disclaimer:
I'm a maintainer of pyfakefs (and I will update the documentation accordingly).

Python相关问答推荐

当多个值具有相同模式时返回空

如何使用matplotlib在Python中使用规范化数据和原始t测试值创建组合热图?

基于索引值的Pandas DataFrame条件填充

使用Python更新字典中的值

如果满足某些条件,则用另一个数据帧列中的值填充空数据帧或数组

为什么\b在这个正则表达式中不解释为反斜杠

Python—转换日期:价目表到新行

如果包含特定值,则筛选Groupby

BeautifulSoup:超过24个字符(从a到z)的迭代失败:降低了首次深入了解数据集的复杂性:

无法在Spyder上的Pandas中将本地CSV转换为数据帧

如何过滤组s最大和最小行使用`transform`'

当输入是字典时,`pandas. concat`如何工作?

为什么dict. items()可以快速查找?

在任何要保留的字段中添加引号的文件,就像在Pandas 中一样

如果列包含空值,则PANAS查询不起作用

通过对列的其余部分进行采样,在Polars DataFrame中填充_null`?

用LAKEF划分实木地板AWS Wrangler

按最大属性值Django对对象进行排序

try 使用RegEx解析由标识多行文本数据的3行头组成的日志(log)文件

如何从具有完整层次数据的Pandas框架生成图形?