如何在Python 2.x和3.x中使用doctest测试异常?

14

我在模块spam中定义了一个异常类SpamException。现在我想要测试一个会抛出这个异常的函数spam_function。因此我编写了以下的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?

1个回答

9
我会打开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

我在添加 # doctest: +IGNORE_EXCEPTION_DETAIL 时没有注意到任何变化,即它在任何Python版本下都会继续失败。你能加一个完整的例子吗? - Helmut Grohne
2
只有当异常类具有返回非空字符串的__str__方法时,IGNORE_EXCEPTION_DETAIL才能起作用。只有在这种情况下,最终的异常行才有一个必需的冒号,以使指令正常工作。 - Helmut Grohne
4
看起来IGNORE_EXCEPTION_DETAIL也会忽略异常消息,这将消除对测试这些行为的大部分意义。但是仍然会检查异常类型。噢! - vaab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接