Как определить, вызывается ли метод, используя Python mock, но не заменяет тело функции? - PullRequest
0 голосов
/ 26 марта 2020

Существует множество примеров, показывающих, как утверждать, что метод был вызван с помощью Mock, например. assert_called_with(), но все они включают замену метода экземпляром Mock.

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

например.

def dosomething(...)
    # creates records that I will test later on.
    ....

def execute():
    ....
    dosomething()

в моих тестах


def test_a(...):
    with patch(dosomething...) as mocked:
        execute()
        mocked.assert_called_with()

Я знаю, что могу проверить записи, которые вместо этого создает dosomething(). Да, я согласен, но я просто хочу выяснить, возможно ли это сделать по моему вопросу.

1 Ответ

0 голосов
/ 26 марта 2020

Используйте Mock s wraps kwarg и передайте ему оригинальный метод.

Например,

>>> from unittest import mock
>>> def hi(name): print('hi', name)
>>> mock_hi = mock.Mock(wraps=hi)

Обёрнутая функция вызывается с помощью mock.

>>> mock_hi('Bob')
hi Bob

Но это все еще издевательство, которое запоминает вызовы.

>>> mock_hi.call_args_list
[call('Bob')]

Вспомните, что patch() передаст дополнительные kwargs к Mock, который он делает, так что вы можете использовать wraps аргумент здесь тоже. Например,

>>> with mock.patch('builtins.float', wraps=float) as mock_float:
...     x = float('inf')
...     print(x)  # If we hadn't wrapped, x would be a mock.
...     print(mock_float.call_args_list)
...
inf
[call('inf')]
...