2013-07-16 4 views
6

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

>>> 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 

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

ответ

4

Я бы включить 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 
+0

я не заметил каких-либо изменений при добавлении '# doctest: + IGNORE_EXCEPTION_DETAIL', т.е. он держит неудачу либо Версия Python. Можете ли вы добавить полный пример? –

+0

'IGNORE_EXCEPTION_DETAIL' работает, как только класс исключения имеет метод' __str__', который возвращает непустую строку. Тогда и только тогда окончательная строка исключений имеет двоеточие, которое требуется для того, чтобы директива работала. –

+0

Кажется, что IGNORE_EXCEPTION_DETAIL игнорирует также сообщение об исключении, которое устраняет значительную часть цели учения этих действий. Но тип исключения по-прежнему проверяется. ouf! – vaab