2009-05-19 9 views
5

Ich teste für Ausnahmen mit Unittest, zum Beispiel:Python Unittest: Wie prüfe ich das Argument in einer Exceptions?

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

und mein Code aufwirft:

raise UnrecognizedAirportError('From') 

die gut funktioniert.

Wie prüfe ich, dass das Argument in der Ausnahme ist, was ich erwarte es zu sein?

Ich möchte irgendwie behaupten, dass capturedException.argument == 'From'.

Ich hoffe, das ist klar genug - danke im Voraus!

Tal.

Antwort

11

So.

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

Ihre Argumente sind in args, wenn Sie einfach Exception Unterklasse.

Siehe http://docs.python.org/library/exceptions.html#module-exceptions

Wenn die Ausnahmeklasse von die Standard Wurzelklasse BaseException abgeleitet wird, der zugehörige Wert liegt als Ausnahme Instanz args zuzuschreiben.


bearbeiten Bigger Beispiel.

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, viel sauberer als meins :) –

+0

Ich weiß, es gab einige Diskussion auf Python-Dev vor einer Weile von assertRaises zu modifizieren, um die gefangene Ausnahme zurückzugeben (und es wurde erwähnt, dass sowohl twisted und bzr gehackt Unittest genau das zu tun). Kennt jemand Frameworks, die das standardmäßig implementieren? Link zur Python-Entwickler-Notiz: http://mail.python.org/pipermail/python-dev/2008-July/081293.html –

1

assertRaises ist ein bisschen simpel, und nicht Sie lassen sich die Details des erhöhten Ausnahme testen darüber hinaus zu einer bestimmten Klasse gehören. Für feinkörnigeres Testen von Ausnahmen müssen Sie mit einem try/except/else Block "rollen" (Sie können es ein für allemal in einer def assertDetailedRaises Methode tun, die Sie zu Ihrer eigenen generischen Unterklasse von unittest's Testfall hinzufügen, dann haben Sie Ihren Test Fälle erben alle Ihre Unterklasse anstelle von Unittests).

Verwandte Themen