2013-07-16 10 views
6

Ich definierte eine Ausnahmeklasse SpamException in einem Modul spam. Jetzt möchte ich eine Funktion spam_function testen, die diese Ausnahme auslöst. Also habe ich den folgenden Doktest geschrieben.Wie testen Ausnahmen mit Doctest in Python 2.x und 3.x?

Der Test ist erfolgreich auf Python 2.x, aber auf Python 3.x schlägt der Test fehl. Der folgende Test funktioniert auf Python 3.x.

>>> spam_function() 
Traceback (most recent call last): 
    .... 
spam.SpamException 

Der bemerkenswerte Unterschied ist hier die Aufnahme des Modulnamens in den Namen der Ausnahme. Wie kann ich einen Doktest schreiben, der sowohl mit Python 2.x als auch mit 3.x funktioniert?

Antwort

4

ich auf der doctest.IGNORE_EXCEPTION_DETAIL Richtlinie wenden würde, wie folgt aus:

>>> spam_function() # doctest: +IGNORE_EXCEPTION_DETAIL 
Traceback (most recent call last) 
    ... 
SpamException: 'lovely spam' 

Aber beachten Sie, dass IGNORE_EXCEPTION_DETAIL nicht für Normalausnahmeobjekte funktioniert (ohne zugehörigen Argumente). Insbesondere ist das folgende Beispiel nicht tragbar Python 3, weil es nach dem Ausnahme-Namen ist nichts:

>>> spam_function() # doctest: +IGNORE_EXCEPTION_DETAIL 
Traceback (most recent call last) 
    ... 
SpamException 
+0

ich keine Veränderung bemerkt haben beim Hinzufügen von '# doctest: + IGNORE_EXCEPTION_DETAIL', dh es ist mit Fehler hält entweder Python-Version. Können Sie ein komplettes Beispiel hinzufügen? –

+0

Das 'IGNORE_EXCEPTION_DETAIL' funktioniert, sobald die betreffende Ausnahmeklasse eine' __str__' -Methode hat, die eine nicht leere Zeichenfolge zurückgibt. Dann und nur dann hat die letzte Ausnahmezeile einen Doppelpunkt, der für die Anweisung benötigt wird. –

+0

Es scheint, dass IGNORE_EXCEPTION_DETAIL auch die Ausnahmebedingungsnachricht ignoriert, die einen großen Teil des Zwecks der Prüfung dieses Verhaltens entfernt. Aber der Ausnahmetyp wird immer noch überprüft. ouf! – vaab

Verwandte Themen