2009-05-19 14 views
5

unittestを使用して例外をテストしています。たとえば、次のようになります。Python unittest:例外の引数をテストするにはどうすればよいですか?

self.assertRaises(UnrecognizedAirportError, func, arg1, arg2) 

とmy code raise:

raise UnrecognizedAirportError('From') 

うまくいきます。

例外の引数が期待どおりであることをどのようにテストしますか?

何とかcapturedException.argument == 'From'をアサーションしたいと思います。

これは十分明確ですが、事前に感謝します。

Tal。

答えて

11

このようにします。あなたは、単にExceptionをサブクラス化する場合

>>> try: 
...  raise UnrecognizedAirportError("func","arg1","arg2") 
... except UnrecognizedAirportError, e: 
...  print e.args 
... 
('func', 'arg1', 'arg2') 
>>> 

あなたの引数は、argsです。

は例外クラスを 標準のルートクラスBaseException、 に由来する場合 例外インスタンスの引数は、属性として関連付けられた値が存在しているhttp://docs.python.org/library/exceptions.html#module-exceptions

を参照してください。


編集ビガー例。

class TestSomeException(unittest.TestCase): 
    def testRaiseWithArgs(self): 
     try: 
      ... Something that raises the exception ... 
      self.fail("Didn't raise the exception") 
     except UnrecognizedAirportError, e: 
      self.assertEquals("func", e.args[0]) 
      self.assertEquals("arg1", e.args[1]) 
     except Exception, e: 
      self.fail("Raised the wrong exception") 
+0

+1私のものよりもはるかに綺麗です:) –

+0

私は、python-devについていくつかの話がありましたが、catchされた例外を返すためにassertRaisesを修正していることを知っています(そして、twistedとbzrはunittestを)。誰かがデフォルトでそれを実装するフレームワークを知っていますか? python-devノートへのリンク:http://mail.python.org/pipermail/python-dev/2008-July/081293.html –

1

assertRaises少し単純化され、そしてあなたはそれが指定されたクラスに属する超えて発生した例外の詳細をテストすることはできません。より細かく例外をテストするには、try/except/elseブロックを使用して自分自身をロールバックする必要があります(これは一度だけ行うことができます。def assertDetailedRaisesメソッドでは、unittestのテストケースの独自の汎用サブクラスに追加してテストします) caseはすべてunittestの代わりにサブクラスを継承します)。

関連する問題