2013-07-16 36 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