Skip to content

Commit

Permalink
gh-113569: Display calls in Mock.assert_has_calls failure when empty (G…
Browse files Browse the repository at this point in the history
  • Loading branch information
wookie184 authored Jan 4, 2024
1 parent 1ae7ceb commit 1600d78
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 18 deletions.
36 changes: 22 additions & 14 deletions Lib/test/test_unittest/testmock/testmock.py
Original file line number Diff line number Diff line change
Expand Up @@ -1547,25 +1547,33 @@ def f(x=None): pass
mock = Mock(spec=f)
mock(1)

with self.assertRaisesRegex(
AssertionError,
'^{}$'.format(
re.escape('Calls not found.\n'
'Expected: [call()]\n'
' Actual: [call(1)]'))) as cm:
with self.assertRaises(AssertionError) as cm:
mock.assert_has_calls([call()])
self.assertEqual(str(cm.exception),
'Calls not found.\n'
'Expected: [call()]\n'
' Actual: [call(1)]'
)
self.assertIsNone(cm.exception.__cause__)

uncalled_mock = Mock()
with self.assertRaises(AssertionError) as cm:
uncalled_mock.assert_has_calls([call()])
self.assertEqual(str(cm.exception),
'Calls not found.\n'
'Expected: [call()]\n'
' Actual: []'
)
self.assertIsNone(cm.exception.__cause__)

with self.assertRaisesRegex(
AssertionError,
'^{}$'.format(
re.escape(
'Error processing expected calls.\n'
"Errors: [None, TypeError('too many positional arguments')]\n"
"Expected: [call(), call(1, 2)]\n"
' Actual: [call(1)]'))) as cm:
with self.assertRaises(AssertionError) as cm:
mock.assert_has_calls([call(), call(1, 2)])
self.assertEqual(str(cm.exception),
'Error processing expected calls.\n'
"Errors: [None, TypeError('too many positional arguments')]\n"
'Expected: [call(), call(1, 2)]\n'
' Actual: [call(1)]'
)
self.assertIsInstance(cm.exception.__cause__, TypeError)

def test_assert_any_call(self):
Expand Down
8 changes: 4 additions & 4 deletions Lib/unittest/mock.py
Original file line number Diff line number Diff line change
Expand Up @@ -1010,8 +1010,8 @@ def assert_has_calls(self, calls, any_order=False):
for e in expected])
raise AssertionError(
f'{problem}\n'
f'Expected: {_CallList(calls)}'
f'{self._calls_repr(prefix=" Actual").rstrip(".")}'
f'Expected: {_CallList(calls)}\n'
f' Actual: {safe_repr(self.mock_calls)}'
) from cause
return

Expand Down Expand Up @@ -1085,7 +1085,7 @@ def _get_child_mock(self, /, **kw):
return klass(**kw)


def _calls_repr(self, prefix="Calls"):
def _calls_repr(self):
"""Renders self.mock_calls as a string.
Example: "\nCalls: [call(1), call(2)]."
Expand All @@ -1095,7 +1095,7 @@ def _calls_repr(self, prefix="Calls"):
"""
if not self.mock_calls:
return ""
return f"\n{prefix}: {safe_repr(self.mock_calls)}."
return f"\nCalls: {safe_repr(self.mock_calls)}."


# Denylist for forbidden attribute names in safe mode
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Indicate if there were no actual calls in unittest
:meth:`~unittest.mock.Mock.assert_has_calls` failure.

0 comments on commit 1600d78

Please sign in to comment.