unittest unit tests run examples example español assertraises assertequal python django unit-testing

tests - ¿Por qué assertRaises no está detectando mi Error de atributo al usar python unittest?



unittest python 3 (3)

Estoy intentando ejecutar esta prueba: self.assertRaises(AttributeError, branch[0].childrennodes) , y branch[0 ] no tiene un atributo childrennodes , por lo que debería estar lanzando un AttributeError , que assertRaises debería detectar, pero cuando ejecuto la prueba, la prueba falla porque está lanzando un AttributeError .

Traceback (most recent call last): File "/home/tttt/../tttt/tests.py", line 504, in test_get_categories_branch self.assertRaises(AttributeError, branch[0].children_nodes) AttributeError: ''Category'' object has no attribute ''children_nodes''

¿Algunas ideas?


Cuando se ejecuta la prueba, antes de llamar a self.assertRaises, Python necesita encontrar el valor de todos los argumentos del método. Al hacerlo, evalúa la branch[0].children_nodes , que genera un AttributeError. Como aún no hemos invocado assertRaises, esta excepción no se detecta, lo que hace que la prueba falle.

La solución es envolver la branch[0].children_nodes en una función o un lambda:

self.assertRaises(AttributeError, lambda: branch[0].children_nodes)

assertRaises también se puede usar como administrador de contexto (desde Python 2.7, o en el paquete PyPI ''unittest2''):

with self.assertRaises(AttributeError): branch[0].children_nodes # etc

Esto es bueno porque se puede usar en bloques de código arbitrarios en medio de una prueba, en lugar de tener que crear una nueva función solo para definir el bloque de código al que se aplica.

Puede darle acceso a la excepción generada para un procesamiento posterior, si es necesario:

with self.assertRaises(AttributeError) as cm: branch[0].children_nodes self.assertEquals(cm.exception.special_attribute, 123)


Pienso que es porque asevera que solo se plantea un reclamable. Se evalúa para ver si el invocable genera una excepción, no si la declaración en sí lo hace.

self.assertRaises(AttributeError, getattr, branch[0], "childrennodes")

Deberia trabajar.

EDITAR:

Como THC4k dice correctamente, recopila las declaraciones en el momento de la recopilación y luego se produce un error, no en el momento de la prueba.

Además, esta es una razón por la que me gusta la nariz, tiene un decorador (aumentos) que es útil y más claro para este tipo de pruebas.

@raises(AttributeError) def test_1(self) branch[0].childrennodes


pytest también tiene un decorador similar:

from pytest import raises def test_raising(): with raises(AttributeError): branch[0].childrennodes