【问题标题】:Exception value is not being caught in pytest.raises context manager [duplicate]pytest.raises 上下文管理器中未捕获异常值[重复]
【发布时间】:2021-10-09 21:04:41
【问题描述】:

当我尝试获取异常的值时,该值未正确断言。

import pytest

class CustomException(Exception):
    """Custom Exception"""
    
    
def raise_custom_exception():
    raise CustomException("This is a test exception")

def test_custom_exception():
    with pytest.raises(CustomException) as execinfo:
        raise_custom_exception()
        assert execinfo == "This is not being caught"

我正在检查异常的值是否与预期值相同,但 pytest 显示所有测试都通过,即使异常的预期值不正确。

➜  *_question pytest main.py
======================= test session starts ==========================
platform darwin -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: /Users/israteneda/*_question
collected 1 item                                                                                                                                                               

main.py .                                                                                                                                                                [100%]

====================== 1 passed in 0.01s =============================

【问题讨论】:

    标签: pytest


    【解决方案1】:

    pytest.raises 上下文管理器在引发异常时退出 - 只有在没有引发异常时才会执行到最后(在这种情况下会引发断言)。因此,要在引发异常后检查其他任何内容,您必须在上下文管理器之外执行此操作:

    def test_custom_exception():
        with pytest.raises(CustomException) as execinfo:
            raise_custom_exception()
        assert execinfo == "This is being caught"
    

    execinfo 不是上下文管理器范围的一部分(对于任何上下文管理器的上下文都是如此),因此它在上下文管理器退出后仍然存在,从而使这成为可能。

    【讨论】:

    • 很好的答案。断言语句上的小书呆子,这总是会失败,因为类型不匹配:-)
    • 哈,没错。而且我没有找到重复的...
    最近更新 更多