mirror of
https://github.com/python/cpython.git
synced 2025-12-10 02:50:09 +00:00
bpo-36871: Handle spec errors in assert_has_calls (GH-16005)
The fix in PR 13261 handled the underlying issue about the spec for specific methods not being applied correctly, but it didn't fix the issue that was causing the misleading error message. The code currently grabs a list of responses from _call_matcher (which may include exceptions). But it doesn't reach inside the list when checking if the result is an exception. This results in a misleading error message when one of the provided calls does not match the spec. https://bugs.python.org/issue36871 Automerge-Triggered-By: @gpshead
This commit is contained in:
parent
bb6bf7d342
commit
b5a7a4f0c2
4 changed files with 64 additions and 5 deletions
|
|
@ -926,13 +926,21 @@ class NonCallableMock(Base):
|
|||
If `any_order` is True then the calls can be in any order, but
|
||||
they must all appear in `mock_calls`."""
|
||||
expected = [self._call_matcher(c) for c in calls]
|
||||
cause = expected if isinstance(expected, Exception) else None
|
||||
cause = next((e for e in expected if isinstance(e, Exception)), None)
|
||||
all_calls = _CallList(self._call_matcher(c) for c in self.mock_calls)
|
||||
if not any_order:
|
||||
if expected not in all_calls:
|
||||
if cause is None:
|
||||
problem = 'Calls not found.'
|
||||
else:
|
||||
problem = ('Error processing expected calls.\n'
|
||||
'Errors: {}').format(
|
||||
[e if isinstance(e, Exception) else None
|
||||
for e in expected])
|
||||
raise AssertionError(
|
||||
'Calls not found.\nExpected: %r%s'
|
||||
% (_CallList(calls), self._calls_repr(prefix="Actual"))
|
||||
f'{problem}\n'
|
||||
f'Expected: {_CallList(calls)}\n'
|
||||
f'Actual: {self._calls_repr(prefix="Actual")}'
|
||||
) from cause
|
||||
return
|
||||
|
||||
|
|
@ -2244,12 +2252,20 @@ class AsyncMockMixin(Base):
|
|||
they must all appear in :attr:`await_args_list`.
|
||||
"""
|
||||
expected = [self._call_matcher(c) for c in calls]
|
||||
cause = expected if isinstance(expected, Exception) else None
|
||||
cause = next((e for e in expected if isinstance(e, Exception)), None)
|
||||
all_awaits = _CallList(self._call_matcher(c) for c in self.await_args_list)
|
||||
if not any_order:
|
||||
if expected not in all_awaits:
|
||||
if cause is None:
|
||||
problem = 'Awaits not found.'
|
||||
else:
|
||||
problem = ('Error processing expected awaits.\n'
|
||||
'Errors: {}').format(
|
||||
[e if isinstance(e, Exception) else None
|
||||
for e in expected])
|
||||
raise AssertionError(
|
||||
f'Awaits not found.\nExpected: {_CallList(calls)}\n'
|
||||
f'{problem}\n'
|
||||
f'Expected: {_CallList(calls)}\n'
|
||||
f'Actual: {self.await_args_list}'
|
||||
) from cause
|
||||
return
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue