2016-11-22 4 views
2

Ich habe Probleme, eine Ausnahme von einer Funktion in meinem Test erhöhen:Python, Mock: raise Ausnahme

### 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 

Ich mag raiseError() Funktion einen Fehler erhöhen.

Ich habe mehrere Beispiele für SO gefunden, aber keine, die meinen Anforderungen entsprachen.

+0

vielleicht dies könnte Ihnen helfen http://stackoverflow.com/questions/2052390/manifest-raiting-wowing-a-exception-in-python –

+1

Sind Sie sicher, dass Sie an der richtigen Stelle patchen (wo importiert wird und nicht wo es * von * importiert wurde)? – jonrsharpe

+0

I _think_, dass ich an der richtigen Stelle einfüge, da meine anderen Tests wie erwartet funktionieren. – user4780495

Antwort

1

I chanched

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

zu

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

und entfernt die # <--- do not work Linie.

Es funktioniert jetzt.

This ist ein gutes Beispiel.

EDIT:

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

auch funktioniert.

2

Ok, Ihre Antwort Sie gültig vorausgesetzt ist, aber man verändert, wie du es getan hast (was in Ordnung ist, um Ihre ursprünglichen Problem zu beheben, müssen Sie eine Funktion zuweisen, die Ergebnisse side_effect, nicht oder ein Objekt.

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 

Hoffnung, das hilft. Beachten Sie, wenn die Ziel Methode args nimmt, muss die Nebenwirkung args nehmen, wie gut (ich glaube).

+0

Sie müssen keine Funktion zuweisen; das ist nur eine der Optionen, aber es ist nicht die beste hier. Ordnen Sie die Ausnahme stattdessen 'side_effect' zu:' mockedObj.raiseError.side_effect = Exception ("Test") '. –

+0

Sie müssen nicht Nein: und seine Bearbeitung hat eine dritte Möglichkeit, es zu tun, wo er ein Mock mit dem Nebeneffekt-Set macht, aber es ist immer noch eine gültige und gute Sache zu wissen, wie man beim Testen macht. Es ist nichts falsch daran, es auf diese Weise zu tun, vor allem, wie Sie Ihren Test später erweitern können? – Jmons

Verwandte Themen