Ответ 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