2013-07-16 38 views
6

我在模块spam中定义了异常类SpamException。现在我想测试一个函数spam_function,这引发了这个异常。所以我写了下面的doctest。如何在Python 2.x和3.x中使用doctest测试异常?

>>> 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的doctest呢?

回答

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

当添加'#文档测试我没有任何通知而变动:+ IGNORE_EXCEPTION_DETAIL',即它保持与任何失败Python版本。你能添加一个完整的例子吗? –

+0

只要有问题的异常类有一个返回非空字符串的__str__方法,'IGNORE_EXCEPTION_DETAIL'就会工作。然后,只有最后的异常行才有冒号,这是指令工作所必需的。 –

+0

看来,IGNORE_EXCEPTION_DETAIL也会忽略异常消息,这会消除文档测试这些行为的很大一部分目的。但是异常类型仍然被检查。 ouf! – vaab