Самый простой способ - использовать side_effect
, которые принимают либо итерируемый, вызываемый, либо исключение (класс или экземпляр)
В качестве альтернативы side_effect
может быть классом или экземпляром исключения. В этом случае исключение будет возникать при вызове mock.
Как показано в Quick Guide вы можете использовать side_effect
, чтобы вызвать исключение, просто
>>> mock = Mock(side_effect=KeyError('foo'))
>>> mock()
Traceback (most recent call last):
...
KeyError: 'foo'
Более того, вы можете использовать список и исключения вместе в side_effect
задания. Поэтому самый простой способ сделать то, что вам нужно, это что-то вроде этого:
>>> m = Mock(side_effect=[1, KeyError("bar"), 3])
>>> m("a")
1
>>> m("b")
...
KeyError: 'bar'
>>> m("c")
3
Другого способа сделать это может быть использовать вызываемый писать логику как ваш макет должен реагировать. В этом случае вы можете свободно выбирать, основываясь на аргументах или состоянии вашего теста.
вы бог посылаете, спасибо! –
стрелять, это работает, чтобы разрешить первый звонок, и бросить второй, но что, если я хочу, чтобы третий звонок был успешным? –
@NathanTregillus взгляните на мой ответ, он также охватывает ваш комментарий. –