gh-113569: Display calls in Mock.assert_has_calls failure when empty (GH-113573)

This commit is contained in:
wookie184 2024-01-04 19:11:34 +00:00 committed by GitHub
parent 1ae7ceba29
commit 1600d78e2d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 18 deletions

View file

@ -1547,25 +1547,33 @@ class MockTest(unittest.TestCase):
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):

View file

@ -1010,8 +1010,8 @@ class NonCallableMock(Base):
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
@ -1085,7 +1085,7 @@ class NonCallableMock(Base):
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)]."
@ -1095,7 +1095,7 @@ class NonCallableMock(Base):
"""
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