unittest tests testcases test setup real method hitchhiker guide examples assertis assertequals python unit-testing

tests - testcases python



Problema de prueba unitaria con assertRaises (2)

Estoy tratando de probar una excepción.

Yo tengo:

def test_set_catch_status_exception(self): mro = self.mro NEW_STATUS = ''No such status'' self.assertRaises(ValueError,mro.setStatus(NEW_STATUS))

Obtuve el siguiente error:

====================================================================== ERROR: test_set_catch_status_exception (__main__.TestManagementReviewGoalGetters) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_ManagementReviewObjective.py", line 68, in test_set_catch_status_exception self.assertRaises(ValueError,mro.setStatus(NEW_STATUS)) File "/Users/eric/Dropbox/ManagementReview.py", line 277, in setStatus raise ValueError(''%s is not in the list of allowed statuses: %s'' % (status,LIST_OF_STATUSES)) ValueError: No such status is not in the list of allowed statuses: [''Concern or Delay'', ''On Track'', ''Off Track/Needs Attention''] ----------------------------------------------------------------------

Gracias


Tenga cuidado si está usando factory boy , este paquete no permite que la excepción se suba al nivel de afirmación, que siempre fallará


self.assertRaises espera una función mro.setStatus , seguida de un número arbitrario de argumentos: en este caso, simplemente NEW_STATUS . self.assertRaises ensambla sus argumentos en la función llamada mro.setStatus(NEW_STATUS) dentro de un bloque try...except , por lo tanto, captura y registra el ValueError si ocurre.

Pasar mro.setStatus(NEW_STATUS) como un argumento a self.assertRaises hace que el ValueError ocurra antes de que self.assertRaises pueda atraparlo.

Así que la solución es cambiar los paréntesis a una coma:

self.assertRaises(ValueError,mro.setStatus,NEW_STATUS)