有没有办法使用 pytest 测试"从 Y 提高 X"?



我想知道是否有更好的方法以及使用 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/

__cause__和__context__有什么区别?

相关内容

  • 没有找到相关文章

最新更新