2013-07-16 30 views
6

Zdefiniowałem klasę wyjątków SpamException w module spam. Teraz chcę przetestować funkcję spam_function, która podnosi ten wyjątek. Napisałem więc poniższy dokument.Jak testować wyjątki za pomocą doctest w Pythonie 2.x i 3.x?

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

Test powiedzie się na Pythonie 2.x, ale na Pythonie 3.x test się nie powiedzie. Poniższy test działa na Pythonie 3.x.

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

Znaczącą różnicą jest tutaj włączenie nazwy modułu do nazwy wyjątku. Więc jak mogę napisać test, który działa zarówno w Pythonie 2.x, jak i 3.x?

Odpowiedz

4

Chciałbym włączyć dyrektywy doctest.IGNORE_EXCEPTION_DETAIL coś takiego:

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

Należy jednak pamiętać, że IGNORE_EXCEPTION_DETAIL nie działa dla prostych obiektów wyjątków (bez towarzyszących argumentów). W szczególności, w poniższym przykładzie nie jest przenośny do Python 3, ponieważ nie ma nic po nazwie wyjątek:

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

I podczas dodawania '# doctest nie zauważył żadnej zmiany: + IGNORE_EXCEPTION_DETAIL', czyli utrzymuje braku albo z Wersja Pythona. Czy możesz dodać pełny przykład? –

+0

'IGNORE_EXCEPTION_DETAIL' działa tak szybko, jak klasa zapytania ma metodę' __str__', która zwraca niepusty ciąg. Wtedy i tylko wtedy końcowa linia wyjątków ma dwukropek, który jest wymagany, aby dyrektywa działała. –

+0

Wygląda na to, że IGNORE_EXCEPTION_DETAIL ignoruje również komunikat wyjątku, który usuwa wielką część celu doctestowania tych zachowań. Ale typ wyjątku jest nadal sprawdzany. ouf! – vaab