有没有一种方法可以使用 pytest 测试“从 Y 提升 X”?
Is there a way to test `raise X from Y` using pytest?
我想知道是否有更好的方法以及使用 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/
What is the difference between __cause__ and __context__?
我想知道是否有更好的方法以及使用 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/
What is the difference between __cause__ and __context__?