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.