我想知道是否有更好的方法以及使用 pytest 测试raise X from Y
的选项是什么。
下面是一个虚拟示例:
import pytest
class AException(Exception):
pass
class A:
def __init__(self) -> None:
raise AException("Class A")
class C:
def __init__(self) -> None:
try:
A()
except AException as err:
raise ValueError("C Failed") from err
def test_class_c():
with pytest.raises(ValueError):
C()
在此示例中,测试应确认它从AException
Class A
引发ValueError
。
显而易见的解决方案是像这样传递消息:
except AException as err:
raise ValueError(f"C Failed: {err}") from err
然后匹配它:
def test_class_c():
with pytest.raises(ValueError, match="Class A"):
C()
但是还有别的办法吗?
我还没有遇到过这样做的官方方法,但一种方法可能是检查__cause__
(或__context__
)最"最新"的异常:
def test_class_c():
with pytest.raises(ValueError) as exc_info:
C()
assert isinstance(exc_info.value.__cause__, AException)
assert exc_info.value.__cause__.args == ("Class A",)
关于__cause__
和__context__
的PEP:https://www.python.org/dev/peps/pep-3134/
__cause__和__context__有什么区别?