有没有一种方法可以使用 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()

在此示例中,测试应确认它从 AExceptionClass 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__?