Как заставить Python MagicMock возвращать значение при первом вызове и вызывать исключение при втором вызове?

У меня есть следующая программа Python, которая использует насмешки.

#!/usr/bin/env python 
import mock

def my_func1():
    return "Hello"

my_func = mock.MagicMock()
my_func.return_value = "Goodbye"

print my_func()
print my_func()

Выход:

Goodbye
Goodbye

Все работает как надо. Отлично.

Но я хочу, чтобы макетный метод вернулся Goodbye в первый раз он вызывается и вызывает исключение во второй раз, когда он вызывается. Как мне это сделать??

2 ответа

Решение

Как указал Сроу, вы можете использовать side_effect, Я бы, вероятно, использовал функцию генератора, а не вводил глобальную:

import mock

def effect(*args, **kwargs):
    yield "Goodbye"
    while True:
        yield Exception

my_func = mock.MagicMock()
my_func.side_effect = effect()

my_func() #Returns "Goodbye!'
my_func() #Raises exception
my_func() #Raises exception

Очевидно, вы, вероятно, не хотите поднять голый Exception, но я не был уверен, какое исключение вы хотели поднять...

Ты можешь использовать side_effect вместо return_value, например:

import mock

a = 0
def my_func1():
    global a
    a += 1
    if a < 2:
        return "Goodbye"
    else:
        raise Exception()

my_func = mock.MagicMock()
my_func.side_effect = my_func1
print my_func()
# output Goodbye
print my_func()
# An exception was raised.
Другие вопросы по тегам