1

我正在对新的 python 数据类进行一些自学。

可以传递给数据类装饰器的参数之一是frozen=True,以使对象不可变。

文档(和经验)表明:

dataclasses.FrozenInstanceError

将引发异常。

当单元测试时(使用pytest),以下测试通过:

def test_change_page_url_values_raises_error(self, PAGE_URL):
    page_url = PageURL(PAGE_URL)
    with pytest.raises(AttributeError) as error:
        page_url.value = PAGE_URL

其中 PageURL 是一个带有 freeze=True 参数的数据类。

任何想法为什么 pytest 表明此操作(为 page_url.value 分配值)会引发属性错误?FrozenInstanceError 是否继承自 AttributeError?

注意:如果我更改单元测试以测试不同的异常(即 TypeError),测试会按预期失败。

4

1 回答 1

3

这是一个子类,您可以使用内置函数轻松验证issubclass

>>> issubclass(FrozenInstanceError, AttributeError)
True

如果您想在测试中进行精确的类型匹配,我认为这是最佳实践,那么您可以使用异常实例而不是异常类。作为一个额外的好处,这还允许您对异常上下文进行断言(即哪个字段触发了异常)。

with pytest.raises(FrozenInstanceError("cannot assign to field 'value'")):
    page_url.value = PAGE_URL

这种用法pytest.raises需要安装我的插件pytest-raisin

于 2019-05-29T22:37:11.517 回答