我正在对新的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),则测试将按预期失败。
答案 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
。