Вы можете скопировать источник из mock.NonCallableMock.assert_called_with
и изменить его так, чтобы вы могли реализовать следующее assert_called_with_partial
, которое частично соответствует ожидаемым аргументам и аргументам ключевых слов:
from unittest import mock
def assert_called_with_partial(_mock_self, *args, **kwargs):
self = _mock_self
if self.call_args is None:
expected = self._format_mock_call_signature(args, kwargs)
raise AssertionError('Expected call: %s\nNot called' % (expected,))
def _error_message():
msg = self._format_mock_failure_message(args, kwargs)
return msg
expected = self._call_matcher((args, kwargs))
expected_args, expected_kwargs = expected
actual_args, actual_kwargs = self._call_matcher(self.call_args)
if actual_args[:len(expected_args)] != expected_args or not (expected_kwargs.items() <= actual_kwargs.items()):
cause = expected if isinstance(expected, Exception) else None
raise AssertionError(_error_message()) from cause
mock.NonCallableMock.assert_called_with_partial = assert_called_with_partial
так что
m = mock.MagicMock()
m(1, 2, a=1, b=2)
m.assert_called_with_partial(1, a=1)
не повысит AssertionError
, а:
m.assert_called_with_partial(1, 2, a=2)
повысит:
AssertionError: Expected call: mock(1, 2, a=2)
Actual call: mock(1, 2, a=1, b=2)