Python数据类:FrozenInstanceError是AttributeError的子类吗?

时间:2019-05-29 13:42:54

标签: python pytest python-dataclasses

我正在对新的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是带有Frozen = True参数的数据类。

有什么想法为什么pytest指示此操作(将值分配给page_url.value)引发属性错误? FrozenInstanceError是否从AttributeError继承?

注意:如果我更改单元测试以测试其他异常(即TypeError),则测试将按预期失败。

1 个答案:

答案 0 :(得分:3)

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

>>> issubclass(FrozenInstanceError, AttributeError)
True

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

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

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