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)