2013-07-16 17 views
6

Ho definito una classe di eccezione SpamException in un modulo spam. Ora voglio testare una funzione spam_function, che solleva questa eccezione. Così ho scritto il seguente doctest.Come testare le eccezioni con doctest in Python 2.xe 3.x?

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

Il test ha esito positivo su Python 2.x, ma su Python 3.x il test ha esito negativo. Il seguente test funziona su Python 3.x.

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

La notevole differenza qui è l'inclusione del nome del modulo nel nome eccezione. Quindi, come posso scrivere un doctest che funzioni sia su Python 2.x che su 3.x?

risposta

4

vorrei accendere la direttiva doctest.IGNORE_EXCEPTION_DETAIL, in questo modo:

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

ma nota che IGNORE_EXCEPTION_DETAIL non funziona per oggetti eccezione di pianura (senza argomenti associati). In particolare, il seguente esempio non è portabile a Python 3, perché non c'è niente che segue il nome eccezione:

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

non ho notato alcun cambiamento quando si aggiunge '# doctest: + IGNORE_EXCEPTION_DETAIL', cioè mantiene in mancanza sia con Versione Python. Puoi aggiungere un esempio completo? –

+0

Il 'IGNORE_EXCEPTION_DETAIL' funziona non appena la classe di eccezione in questione ha un metodo' __str__' che restituisce una stringa non vuota. Quindi e solo allora la riga di eccezione finale ha due punti, che è necessario affinché la direttiva funzioni. –

+0

Sembra che IGNORE_EXCEPTION_DETAIL ignori anche il messaggio di eccezione, che rimuove gran parte dello scopo di doctest di questi comportamenti. Ma il tipo di eccezione è ancora controllato. ouf! – vaab

Problemi correlati