юнит-тест python вызывается с частичным - PullRequest
0 голосов
/ 04 октября 2018

с использованием python 3.5.3 Я хочу утверждать, что максируемая функция получила конкретные аргументы, но я не хочу проверять все полученные аргументы, только те, которые важны для теста.

например,вместо этого:

my_func_mock.assert_called_with('arg1','arg2','arg3')

Я хотел бы сделать что-то вроде:

my_func_mock.assert_called_with_partial(arg2='arg2')

Возможно ли это?

1 Ответ

0 голосов
/ 04 октября 2018

Вы можете скопировать источник из 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...