2009-05-19 19 views
5

jestem testowania wyjątki przy użyciu unittest, na przykład:Python unittest: jak przetestować argument w wyjątkach?

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

i budzi mój kod:

raise UnrecognizedAirportError('From') 

który działa dobrze.

Jak przetestować, czy argument w wyjątku jest tym, czego się spodziewam?

Pragnę w jakiś sposób potwierdzić, że capturedException.argument == 'From'.

Mam nadzieję, że jest to wystarczająco jasne - z góry dzięki!

Tal.

Odpowiedz

11

Podoba mi się to.

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

Twoje argumenty są w args, jeśli po prostu podklasy Exception.

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

Jeśli klasa wyjątkiem pochodzi z standardową klasę korzeń BaseException, powiązany wartość atrybutu jest obecny jako argumenty instancja wyjątek, jest.


Edycja większe Przykład.

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, o wiele czystsze niż moje :) –

+0

Wiem, że było trochę czasu na pythonie-dev w trakcie modyfikacji assertRaises, aby zwrócić złapany wyjątek (i wspomniano, że zarówno skręcony, jak i bzr zhakowano, aby zrobić to samo). Czy ktoś wie o jakichkolwiek frameworkach, które domyślnie implementują to. Link do notatki python-dev: http://mail.python.org/pipermail/python-dev/2008-July/081293.html –

1

assertRaises jest nieco uproszczone i nie pozwalają sprawdzić szczegóły podniesionej poza wyjątkiem, że przynależność do określonej klasy. Aby uzyskać dokładniejsze testy wyjątków, musisz "przetoczyć swój własny" z blokiem try/except/else (możesz to zrobić raz na zawsze w metodzie def assertDetailedRaises dodanej do własnej podklasy generycznej testu jednostkowego Unittest, a następnie przeprowadź test wszystkie przypadki dziedziczą twoją podklasę zamiast unittest).

Powiązane problemy