2013-07-16 7 views
6

例外クラスSpamExceptionをモジュールspamに定義しました。今、この例外を発生させる関数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は(なし関連する引数を持つ)無地例外オブジェクトのために動作しないことに注意してください。 `#1のdoctestを追加するとき、私は何の変化も気付かなかった

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

:+ IGNORE_EXCEPTION_DETAIL'、それはどちらかで失敗し続ける、つまり何も例外名以下がないので、具体的には、次の例では、Pythonの3に移植性がありませんPythonバージョン。あなたは完全な例を追加できますか? –

+0

'IGNORE_EXCEPTION_DETAIL'は、問題の例外クラスが空でない文字列を返す' __str__'メソッドを持つとすぐに動作します。次に、最後の例外行にはコロンが付いています。これはディレクティブが動作するために必要です。 –

+0

IGNORE_EXCEPTION_DETAILは例外メッセージも無視しているようです。例外メッセージは、これらの動作のdoctestingの目的の大部分を取り除きます。しかし、例外タイプはまだチェックされています。おお! – vaab

関連する問題