如何获取python';s MagicMock在第一次调用时返回值,在第二次调用时引发异常?

如何获取python';s MagicMock在第一次调用时返回值,在第二次调用时引发异常?,python,mocking,magicmock,Python,Mocking,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 一切都正常运转。太好了 但是我希望mockout方法在第一次调用时返回再见,并在第二次调用

我有以下使用模拟的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
一切都正常运转。太好了


但是我希望mockout方法在第一次调用时返回
再见
,并在第二次调用时引发异常。我该怎么做呢?

您可以使用
副作用
而不是
返回值
,例如:

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.
导入模拟
a=0
定义我的函数1():
全球a
a+=1
如果a<2:
回复“再见”
其他:
引发异常()
my_func=mock.MagicMock()
我的功能副作用=我的功能1
打印我的函数()
#输出再见
打印我的函数()
#提出了一个例外。

正如Sraw指出的,您可以使用
副作用。我可能会使用生成器函数,而不是引入全局函数:

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
显然,您可能不想引发一个简单的
异常,但我不确定您想引发什么异常