【问题标题】:Is there a way to test `raise X from Y` using pytest?有没有办法使用pytest测试`raise X from Y`?
【发布时间】:2021-10-29 09:27:29
【问题描述】:

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

但是还有其他方法吗?

【问题讨论】:

    标签: python python-3.x pytest


    【解决方案1】:

    我没有遇到过这样做的官方方法,但一种方法可能是检查__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__?

    【讨论】:

    • 不错的建议,谢谢!
    猜你喜欢
    • 2016-06-02
    • 2016-07-27
    • 1970-01-01
    • 2023-01-28
    • 2021-06-24
    • 2018-06-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    相关资源
    最近更新 更多