UnitTest Python издевается над одним вызовом одной функции

Я использую Mock (http://www.voidspace.org.uk/python/mock/mock.html) и наткнулся на конкретный макет, который я не могу найти решение.

У меня есть функция с несколькими вызовами some_function, которая является Mocked.

def function():
    some_function(1)
    some_function(2)
    some_function(3)

Я только хочу высмеять первый и третий вызов some_function. Второй звонок, который я хочу сделать с реальной функцией.

Я попробовал несколько альтернатив с http://www.voidspace.org.uk/python/mock/mock.html#mock.Mock.mock_calls, но безуспешно.

Заранее благодарим за помощь.

Ответ 1

Кажется, аргумент wraps может быть тем, что вы хотите:

wraps: элемент для обманного объекта. Если обертки не являются None, тогда вызов Mock передает вызов через завернутый объект (возвращая реальный результат и игнорирование return_value).

Однако, поскольку вы хотите, чтобы второй вызов не был издевательством, я предложил бы использовать mock.side_effect.

Если side_effect является итерируемым, каждый вызов макета возвращается следующее значение из итерируемого.

Если вы хотите вернуть другое значение для каждого вызова, оно идеально подходит:

somefunction_mock.side_effect = [10, None, 10] 

Только первый и третий вызовы somefunction вернут 10.

Однако, если вам нужно вызвать реальную функцию, но не во второй раз, вы также можете передать side_effect вызываемый, но я нахожу его довольно уродливым (возможно, умнее это сделать):

 class CustomMock(object):

     calls = 0

     def some_function(self, arg):
         calls = calls + 1
         if calls != 2:
             return my_real_function(arg)
         else:
             return DEFAULT

somefunction_mock.side_effect = CustomMock().some_function