Как тестировать исключения с помощью doctest в Python 2.x и 3.x?

Я определил класс исключений SpamException в модуле spam. Теперь я хочу протестировать функцию spam_function, которая вызывает это исключение. Поэтому я написал следующий доктест.

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

Тест проходит успешно на Python 2.x, но на Python 3.x тест терпит неудачу. Следующий тест работает на Python 3.x.

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

Заметным отличием здесь является включение имени модуля в имя исключения. Итак, как я могу написать doctest, который работает как на Python 2.x, так и на 3.x?


person Helmut Grohne    schedule 16.07.2013    source источник


Ответы (1)


Я бы включил директиву doctest.IGNORE_EXCEPTION_DETAIL, например:

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

Но обратите внимание, что IGNORE_EXCEPTION_DETAIL не работает для простых объектов исключений (без связанных аргументов). В частности, следующий пример нельзя перенести на Python 3, потому что за именем исключения ничего не следует:

>>> spam_function() # doctest: +IGNORE_EXCEPTION_DETAIL
Traceback (most recent call last)
    ...
SpamException
person jalanb    schedule 22.08.2013
comment
Я не заметил никаких изменений при добавлении # doctest: +IGNORE_EXCEPTION_DETAIL, т.е. он продолжает давать сбой с любой версией Python. Можете ли вы добавить полный пример? - person Helmut Grohne; 10.09.2013
comment
IGNORE_EXCEPTION_DETAIL работает, как только рассматриваемый класс исключений имеет метод __str__, возвращающий непустую строку. Тогда и только тогда в последней строке исключения есть двоеточие, необходимое для работы директивы. - person Helmut Grohne; 17.09.2013
comment
Кажется, что IGNORE_EXCEPTION_DETAIL также игнорирует сообщение об исключении, которое устраняет большую часть цели проверки этого поведения. Но тип исключения все еще проверяется. уф! - person vaab; 05.01.2015