Verify exception chaining in a function
Preconditions (2)
✅ Expected Result: The test should pass confirming the exception chain is correctly raised and accessible
import pytest class CustomError(Exception): pass def function_that_raises(): try: raise ValueError("Original error message") except ValueError as e: raise CustomError("Chained error message") from e def test_exception_chain(): with pytest.raises(CustomError) as exc_info: function_that_raises() raised_exc = exc_info.value # Assert the raised exception message assert str(raised_exc) == "Chained error message", "Raised exception message mismatch" # Assert the cause is set assert raised_exc.__cause__ is not None, "Exception cause should not be None" # Assert the original exception type and message assert isinstance(raised_exc.__cause__, ValueError), "Cause exception type mismatch" assert str(raised_exc.__cause__) == "Original error message", "Cause exception message mismatch"
This test defines a function function_that_raises which raises a CustomError chained from a ValueError. The test test_exception_chain uses pytest.raises to catch the CustomError. It then asserts the message of the raised exception, checks that the __cause__ attribute is set (meaning the exception was chained), and verifies the type and message of the original exception. This confirms the exception chaining behavior works as expected.
Now add data-driven testing with 3 different original exception messages and verify chaining for each
raise NewException() from OriginalException() to chain exceptions.pytest.raises() context must match the exception actually raised, here TypeError.excinfo.value.__cause__ be?
def func():
try:
raise ValueError("original error")
except ValueError as e:
raise TypeError("new error") from e
def test_func():
with pytest.raises(TypeError) as excinfo:
func()def test_chain():
with pytest.raises(TypeError) as excinfo:
raise TypeError("error") from ValueError("cause")
assert isinstance(excinfo.value.__cause__, TypeError)RuntimeError caused by a KeyError. Which pytest test code correctly verifies both exceptions?Pass the test and this pattern moves unknown