2017-09-27 43 views
1

我有以下使用模擬的python程序。如何讓python的MagicMock在第一次調用時返回一個值,並在第二次調用時引發異常?

#!/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,並在第二次調用它時引發異常。我怎樣才能做到這一點??

回答

1

由於將sRAW指出的那樣,你可以使用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,但我不知道你在想什麼提高例外...

1

可以使用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. 
相關問題