Python unittest: como faço para testar o argumento em um Exceções?

votos
5

Eu estou testando para Exceções usando unittest, por exemplo:

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

e meu código levanta:

raise UnrecognizedAirportError('From')

Que funciona bem.

Como faço para testar se o argumento na exceção é o que eu esperava que fosse?

Desejo afirmar que de alguma forma capturedException.argument == 'From'.

Espero que isso é bastante claro - obrigado antecipadamente!

Tal.

Publicado 19/05/2009 em 16:10
fonte usuário
Em outras línguas...                            


2 respostas

votos
11

Como isso.

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

Seus argumentos estão em args, se você simplesmente subclasse Exception.

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

Se a classe excepção é derivado da classe BaseException raiz padrão, o valor associado está presente como atributo args da instância excepção.


Editar Exemplo maior.

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" )
Respondeu 19/05/2009 em 16:19
fonte usuário

votos
1

assertRaisesé um pouco simplista, e não permite que você teste os detalhes da exceção levantada além dele pertencer a uma classe especificada. Para os testes de grão mais fino de exceções, é preciso "rolar o seu próprio" com um try/except/elsebloco (você pode fazê-lo uma vez por todas em um def assertDetailedRaisesmétodo que você adicionar à sua própria subclasse genérica do teste caso do unittest, em seguida, ter seus casos de teste todos herdar sua subclasse em vez de unittest do).

Respondeu 19/05/2009 em 16:23
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more