2009-05-19 9 views
5

Je teste pour les exceptions en utilisant unittest, par exemple:Python unittest: comment tester l'argument dans une exception?

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

et mon code AUGMENTATIONS:

raise UnrecognizedAirportError('From') 

Ce qui fonctionne bien.

Comment puis-je tester que l'argument de l'exception correspond à ce que je souhaite qu'il soit?

Je souhaite en quelque sorte affirmer que capturedException.argument == 'From'. J'espère que c'est assez clair - merci d'avance!

Tal.

Répondre

11

Comme ceci.

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

Vos arguments sont args, si vous sous-classe tout simplement Exception.

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

Si la classe d'exception est dérivé de la BaseException standard classe racine, la valeur associée est présente sous forme de args de l'instance d'exception attribut.


Modifier Plus grand exemple.

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, beaucoup plus propre que le mien :) –

+0

Je sais qu'il y a eu des discussions sur python-dev il y a quelques temps de modifier assertRaises pour retourner l'exception interceptée (et il a été mentionné que twisted et bzr piraté unittest juste). Quelqu'un connaît-il des frameworks qui implémentent cela par défaut? Lien vers la note python-dev: http://mail.python.org/pipermail/python-dev/2008-July/081293.html –

1

assertRaises est un peu simpliste, et ne vous permet pas de tester les détails de l'exception soulevée au-delà appartenant à une catégorie déterminée. Pour des tests d'exceptions plus précis, vous devez "rouler le vôtre" avec un bloc try/except/else (vous pouvez le faire une fois pour toutes dans une méthode def assertDetailedRaises que vous ajoutez à votre propre sous-classe générique du cas-test d'unittest, puis passez votre test tous les cas héritent de votre sous-classe au lieu de unittest).

Questions connexes