2012-08-01 19 views

Antwort

59

Die Funktion-prüft, ob ein Funktionsaufruf eine bestimmte Ausnahme auslöst, wenn bestimmte Parameter angezeigt werden.

Zum Beispiel, wenn Sie eine Funktion add hatten, die zwei Zahlen hinzufügt, sollte es wahrscheinlich eine TypeError auslösen, wenn Sie es übergeben, sagen wir, eine ganze Zahl und eine Zeichenfolge. Also:

from nose.tools import assert_raises 

def add(x, y): 
    return x + y 

assert_raises(TypeError, add, 2, "0") 

Das erste Argument ist der Ausnahme-Typ, den Sie erwarten. Die zweite ist die Funktion zum Anrufen. Der Rest der Argumente wird an die Funktion übergeben (in diesem Fall werden sie innerhalb der Funktion x und y).

Wenn die erwartete Ausnahme von der Funktion ausgelöst wird, wird die Assertion übergeben.

+1

Okay, danke! Aber wissen Sie auch eine Link für eine gute Nase Dokumentation, wo ich andere Nose Funktionen Prüfung kann wie assert_equal, assert_raises! @kindall – user1544624

+0

Ich hatte Probleme, dass zu finden, auch. Sie können jedoch 'help (assert_rases)' versuchen. – kindall

+4

Ein bisschen versteckt, aber http://nose.readthedocs.org/en/latest/testing_tools.html#module-nose.tools ersten Absatz heißt: "... und alle die gleichen assertX Methoden gefunden in unittest.TestCase (nur in PEP 8 Mode geschrieben, also assert_equal statt assertEqual). ". Hier ist diese Liste: http://docs.python.org/2/library/unittest.html#assert-methods –

78

Während die akzeptierte Antwort korrekt ist, denke ich, es gibt eine bessere Verwendung assert_raises Methode. Wenn Sie einfach bestätigen möchten, dass eine Ausnahme auftritt, ist es wahrscheinlich einfacher und sauberer, @raises Syntax zu verwenden.

@raises(HTTPError) 
def test_exception_is_raised: 
    call_your_method(p1, p2) 

jedoch annehmen, dass Sie etwas mehr mit der erhöhten Ausnahme machen wollen, zum Beispiel: Wir brauchen, dass httperror vom Typ 401 angehoben zu behaupten: Unerlaubten, statt 500: Server-Fehler.

In solch einer Situation oben ist Syntax nicht so hilfreich, wir sollten die assert_raises aber auf eine andere Weise verwenden. Wenn wir es nicht übergeben callable als zweiter Parameter assert_raises wird zurück einen Kontext, den wir verwenden können, um die Ausnahme Details weiter zu testen.

def test_exception_is_raised: 
    with assert_raises(HTTPError) as cm: 
     call_your_method(p1, p2) 
    ex = cm.exception # raised exception is available through exception property of context 
    ok_(ex.code == 401, 'HTTPError should be Unauthorized!') 
+8

Dank lehrte mich etwas Neues. – user1544624

+0

Ich möchte die Nachricht der Ausnahme sehen. Das ex i erhalten von cm.exception hat eine leere ex.message. Die Ausnahme wird jedoch mit einer Nachricht ausgelöst. Was läuft falsch? – akshitBhatia

+1

Der einzige Ort, an dem ich Informationen darüber finden konnte, wie man das macht ... –