Exception & callable assertions¶
Assertions for callables: expected exceptions and the value returned by a call.
Expected exception mixin.
raises ¶
Asserts that val is callable and set the expected exception.
Just sets the expected exception, but never calls val, and therefore never fails. You must
chain to when_called_with() to invoke val().
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
ex
|
type
|
the expected exception |
required |
Examples:
Usage:
assert_that(some_func).raises(RuntimeError).when_called_with('foo')
Returns:
| Name | Type | Description |
|---|---|---|
AssertionBuilder |
Self
|
returns a new instance (with the expected exception) to chain the next assertion |
Source code in assertpy2/exception.py
when_called_with ¶
Asserts that val, when invoked with the given args and kwargs, meets the set expectation.
Invokes val() with the given args and kwargs. You must first set an expectation with
raises() or
does_not_raise() (expected exception),
or with
warns() or
does_not_warn() (expected warning).
Only what happens before the call returns is judged. A call that hands back an awaitable or an
async generator is refused with TypeError, since what it does when awaited or iterated comes
later. A plain generator is judged as returned: its body runs only when it is consumed.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
*some_args
|
object
|
the args to call |
()
|
**some_kwargs
|
object
|
the kwargs to call |
{}
|
Examples:
Usage:
def some_func(a):
raise RuntimeError('some error!')
assert_that(some_func).raises(RuntimeError).when_called_with('foo')
Returns:
| Name | Type | Description |
|---|---|---|
AssertionBuilder |
Self
|
returns a new instance (now with the captured exception or warning message as the val) to chain to the next assertion |
Raises:
| Type | Description |
|---|---|
AssertionError
|
if val does not meet the set expectation |
TypeError
|
if no expectation set first |
Source code in assertpy2/exception.py
returned ¶
Pivots the chain to the value val() returned during
when_called_with().
Use after a call that completed normally (warns(),
does_not_warn(), or
does_not_raise()) to assert
on the return value in the same chain.
Examples:
Usage:
assert_that(make_client).warns(DeprecationWarning).when_called_with().returned().is_instance_of(Client)
assert_that(adder).does_not_raise(TypeError).when_called_with(1, 2).returned().is_equal_to(3)
Returns:
| Name | Type | Description |
|---|---|---|
AssertionBuilder |
Self
|
a new instance wrapping the captured return value |
Raises:
| Type | Description |
|---|---|
TypeError
|
if no return value was captured (the call raised, or
|
Source code in assertpy2/exception.py
raised ¶
Pivots the chain to the exception object caught by
when_called_with(), to assert on its type,
args, or custom attributes - not only its message string.
Examples:
Usage:
err = assert_that(load).raises(ConfigError).when_called_with("bad").raised().value
assert_that(err.code).is_equal_to(42)
Returns:
| Name | Type | Description |
|---|---|---|
AssertionBuilder |
Self
|
a new instance wrapping the caught exception object |
Raises:
| Type | Description |
|---|---|
TypeError
|
if no exception was captured (the call did not raise, or
|
Source code in assertpy2/exception.py
caused_by ¶
Asserts the caught exception was chained from a cause of type ex (raise ... from, or an
exception raised during handling), then pivots the chain to that cause's message.
Examples:
Usage:
assert_that(save).raises(ServiceError).when_called_with(row).caused_by(TimeoutError)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
ex
|
ClassInfo
|
the expected cause type, or a union or tuple of them as |
required |
Returns:
| Name | Type | Description |
|---|---|---|
AssertionBuilder |
Self
|
a new instance wrapping the cause's message (chain on it, or walk deeper) |
Raises:
| Type | Description |
|---|---|
TypeError
|
if |
Source code in assertpy2/exception.py
has_root_cause ¶
Asserts the root of the caught exception's cause chain is of type ex, then pivots the chain
to that root cause's message.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
ex
|
ClassInfo
|
the expected root-cause type, or a union or tuple of them as |
required |
Returns:
| Name | Type | Description |
|---|---|---|
AssertionBuilder |
Self
|
a new instance wrapping the root cause's message |
Raises:
| Type | Description |
|---|---|
TypeError
|
if |
Source code in assertpy2/exception.py
contains_error ¶
Asserts the caught exception is an exception group that contains, recursively, an exception of
each given type (for raises(ExceptionGroup)).
A caught exception that is not a group fails with not_ as well: negation inverts what the group
holds, never whether there is a group.
Examples:
Usage:
assert_that(run_tasks).raises(ExceptionGroup).when_called_with().contains_error(ValueError, KeyError)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
*ex_types
|
type
|
the exception types the group must contain |
()
|
Returns:
| Name | Type | Description |
|---|---|---|
AssertionBuilder |
Self
|
this instance, to chain further assertions on the group |
Raises:
| Type | Description |
|---|---|
ValueError
|
if called with no types at all, which nothing could fail |
TypeError
|
if given anything but an exception class |
Source code in assertpy2/exception.py
does_not_contain_error ¶
Asserts the caught exception group holds none of the given types, at any depth.
The none-of counterpart to contains_error()
rather than its negation: that one asks for every type given, this one refuses every type given.
With several arguments both can fail on the same group, which is what "some but not all" means.
A caught exception that is not a group fails it with or without not_.
Examples:
Usage:
assert_that(run_tasks).raises(ExceptionGroup).when_called_with().does_not_contain_error(KeyError)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
*ex_types
|
type
|
the exception types the group must not contain |
()
|
Returns:
| Name | Type | Description |
|---|---|---|
AssertionBuilder |
Self
|
this instance, to chain further assertions on the group |
Raises:
| Type | Description |
|---|---|
ValueError
|
if called with no types at all, which nothing could fail |
TypeError
|
if given anything but an exception class |
Source code in assertpy2/exception.py
errors ¶
Pivots the chain to the list of leaf exceptions in the caught group, nested ones flattened.
Flattened rather than one level deep, because that is what
contains_error() already searches: a group
holding a group is an implementation detail of whoever raised it, and a suite asking "what
failed" means the leaves. The view this was reached from still holds the group, so
raised() on that answers with the whole tree when
the shape itself is the point. It is not offered on the leaves, which are a collection.
Examples:
Usage:
assert_that(run_tasks).raises(ExceptionGroup).when_called_with().errors().is_length(2)
assert_that(run_tasks).raises(ExceptionGroup).when_called_with().errors().extracting(
"args"
).contains(("bad id",))
Returns:
| Name | Type | Description |
|---|---|---|
AssertionBuilder |
Self
|
a new instance wrapping the leaves as a list, to ask a collection anything |
Raises:
| Type | Description |
|---|---|
TypeError
|
if no exception was captured |
Source code in assertpy2/exception.py
error_of ¶
Asserts the caught group holds an exception of type ex, then pivots to that one's message.
The step contains_error() cannot take: after
it the chain still holds the group's message, so asking what one failure said meant reaching into
the tree by hand.
Both search the same exceptions, groups included, so whatever one finds the other pivots to. Asking
for a group type therefore answers with that group, and for the outermost one that is the message
the chain already held. A caught exception that is not a group fails it with or without not_.
Examples:
Usage:
assert_that(run_tasks).raises(ExceptionGroup).when_called_with().error_of(ValueError).contains("bad id")
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
ex
|
type
|
the type to pivot to, the first one found, the group itself before its members |
required |
Returns:
| Name | Type | Description |
|---|---|---|
AssertionBuilder |
Self
|
a new instance wrapping that exception's message (chain on it, or
|
Raises:
| Type | Description |
|---|---|
TypeError
|
if given anything but an exception class |
Source code in assertpy2/exception.py
matches_error_tree ¶
Asserts the caught group holds exactly these exceptions, in exactly this nesting.
The question contains_error() does not ask.
That one searches the whole tree for a type and says nothing about how many others there are or
how deep it sat, so a group that grew an extra failure, or one whose members moved into a
subgroup, still passes it. This one reads the shape.
A list is a subgroup and a type is one exception, so (ValueError, [KeyError]) means a group of
two members whose second is a subgroup holding one KeyError. A type matches by isinstance,
the way the rest of the family does, so Exception matches a subgroup node as readily as a leaf,
and stops there: only a nested list looks inside one, and what a matched subgroup holds is unsaid.
Order is not part of the shape. Whoever raised the group usually did not choose it: an
asyncio.TaskGroup reports its failures in the order the tasks finished. A caught exception that
is not a group fails it with or without not_.
Examples:
Usage:
assert_that(run_tasks).raises(ExceptionGroup).when_called_with().matches_error_tree(
ValueError, [KeyError, KeyError]
)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
*expected
|
type | list[Any]
|
one entry per member of the group, a type for an exception and a list for a subgroup |
()
|
Returns:
| Name | Type | Description |
|---|---|---|
AssertionBuilder |
Self
|
this instance, to chain further assertions on the group |
Raises:
| Type | Description |
|---|---|
ValueError
|
if called with no entries at all, as the rest of the family does |
TypeError
|
if an entry is neither an exception class nor a list, or is an empty list, which is a group with no members and cannot be raised |
Source code in assertpy2/exception.py
does_not_raise ¶
Asserts that val is callable and sets the not-expected exception.
Just sets the not-expected exception, but never calls val. You must
chain to when_called_with() to invoke val().
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
ex
|
type
|
the exception that should not be raised |
required |
Examples:
Usage:
assert_that(some_func).does_not_raise(RuntimeError).when_called_with('foo')
Returns:
| Name | Type | Description |
|---|---|---|
AssertionBuilder |
Self
|
returns a new instance to chain to the next assertion |