2012-01-22 7 views
5

Estoy tratando de escribir una prueba unitaria que garantice que se genere una HTTPException cuando sea necesario. Aquí está la prueba:failureRises failure

import unittest 
from requests import HTTPError 
import pyport 

# Code omitted... 
def test_bad_item_type(self): 
    """A bad item type should raise a HTTPError""" 
    test_type = 'bad' 
    test_id = 1986134 
    self.assertRaises(HTTPError, pyport.get_item(test_type, test_id)) 

que produce lo siguiente:

ERROR: test_bad_item_type (__main__.TestPyportFunctions) A bad item 
type should raise requests.HTTPError 
---------------------------------------------------------------------- 
Traceback (most recent call last): File "./tests.py", line 65, in 
test_bad_item_type 
    self.assertRaises(HTTPError, pyport.get_item(test_type, test_id)) File "/home/sean/workspace/pyport/pyport.py", line 54, in get_item 
    response.raise_for_status() File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 741, fin raise_for_status 
    raise HTTPError('%s Client Error' % self.status_code) HTTPError: 404 Client Error 

La excepción es elevado, pero no es atrapado por la prueba. Esto es similar a lo que sucedió en this question, pero no es lo mismo. ¿Puede alguien decirme lo que me estoy perdiendo?

Respuesta

7

Debería ser:

self.assertRaises(HTTPError, pyport.get_item, test_type, test_id) 

ver la firma de assertRaises:

assertRaises(exception, callable, *args, **kwds) 

Esto se define de esta manera porque si lo hace a su manera, el intérprete de Python primeros llamadas pyport.get_item(test_type, test_id) y luego pasa su resultado a assertRaises. El resultado es assertRaises no se llama en absoluto y la excepción no se detecta. Ahora si assertRaises tiene acceso a la función y sus argumentos, puede llamar a la función en sí y atrapar la excepción apropiada.

+0

Gracias por su explicación detallada. –

1

Si está utilizando Python 2.7 o posterior o está utilizando el módulo unittest2 portado en lugar de unittest, puede evitar tener que escribir extraña sintaxis cuando se utiliza assertRaises usándolo como un gestor de contexto:

with self.assertRaises(HTTPError): 
    pyport.get_item(test_type, test_id) 

http://docs.python.org/library/unittest.html#basic-example

Cuestiones relacionadas