2016-11-22 54 views
2

我遇到的問題提出從功能異常在我的測試:Python中,模擬:引發異常

### Implemetation 
def MethodToTest(): 
    myVar = StdObject() 
    try: 
     myVar.raiseError() # <--- here 
     return True 
    except Exception as e: 
     # ... code to test 
     return False 

### Test file 
@patch('stdLib.StdObject', autospec=True) 
def test_MethodeToTest(self, mockedObjectConstructor): 
    mockedObj = mockedObjectConstructor.return_value 
    mockedObj.raiseError.side_effect = Exception('Test') # <--- do not work 
    ret = MethodToTest() 
    assert ret is False 

我想raiseError()函數產生一個錯誤。

我在SO上發現了幾個例子,但沒有一個符合我的需要。

+0

也許這可以幫助你http://stackoverflow.com/questions/2052390 /手動提升拋出python中的異常 –

+1

您確定您在正確的位置進行了修補(它已導入,而不是從*導入的位置)? – jonrsharpe

+0

我認爲我在正確的位置打補丁,因爲我的其他測試按預期工作。 – user4780495

回答

1

我chanched

@patch('stdLib.StdObject', autospec=True) 

@patch('stdLib.StdObject', **{'return_value.raiseError.side_effect': Exception()}) 

和除去# <--- do not work線。

它現在正在工作。

This就是一個很好的例子。

編輯:

mockedObj.raiseError.side_effect = Mock(side_effect=Exception('Test')) 

也適用。

2

好吧,你提供你的答案是有效的,但你改變了你是如何做到的(這是罰款要解決原來的問題,你需要一個函數分配給side_effect,不結果或對象:

def my_side_effect(): 
    raise Exception("Test") 

@patch('stdLib.StdObject', autospec=True) 
def test_MethodeToTest(self, mockedObjectConstructor): 
    mockedObj = mockedObjectConstructor.return_value 
    mockedObj.raiseError.side_effect = my_side_effect # <- note no brackets, 
    ret = MethodToTest() 
    assert ret is False 

希望有所幫助。請注意,如果目標方法將指定參數時,副作用需要採取ARGS以及(我相信)。

+0

您不需要分配功能;這只是其中一種選擇,但這不是最好的選擇。只需將該異常分配給'side_effect':'mockedObj.raiseError.side_effect = Exception(「Test」)'。 –

+0

你不需要:沒有,他的編輯有第三種方式做他的模擬副作用集,但它仍然是一個有效的,好東西知道如何做測試。 Theres沒有錯,這樣做,尤其是因爲它可以讓你延遲你的測試? – Jmons