Puede definir assertNotRaisesreutilizando aproximadamente el 90% de la implementación original de assertRaisesen el unittestmódulo. Con este enfoque, terminas con un assertNotRaisesmétodo que, aparte de su condición de falla inversa, se comporta de manera idéntica assertRaises.
TLDR y demostración en vivo
Resulta sorprendentemente fácil agregarle un assertNotRaisesmétodo unittest.TestCase(me tomó alrededor de 4 veces más tiempo escribir esta respuesta que el código). Aquí hay una demostración en vivo del assertNotRaisesmétodo en acción . Al igual queassertRaises , puede pasar un invocable y argumentos a assertNotRaises, o puede usarlo en una withdeclaración. La demostración en vivo incluye una prueba de casos que demuestra que assertNotRaisesfunciona según lo previsto.
Detalles
La implementación de assertRaisesin unittestes bastante complicada, pero con un poco de subclases inteligentes puede anular e invertir su condición de falla.
assertRaiseses un método corto que básicamente solo crea una instancia de la unittest.case._AssertRaisesContextclase y la devuelve (consulte su definición en el unittest.casemódulo). Puede definir su propia _AssertNotRaisesContextclase subclasificando _AssertRaisesContexty anulando su __exit__método:
import traceback
from unittest.case import _AssertRaisesContext
class _AssertNotRaisesContext(_AssertRaisesContext):
def __exit__(self, exc_type, exc_value, tb):
if exc_type is not None:
self.exception = exc_value.with_traceback(None)
try:
exc_name = self.expected.__name__
except AttributeError:
exc_name = str(self.expected)
if self.obj_name:
self._raiseFailure("{} raised by {}".format(exc_name,
self.obj_name))
else:
self._raiseFailure("{} raised".format(exc_name))
else:
traceback.clear_frames(tb)
return True
Normalmente define clases de casos de prueba haciendo que hereden de TestCase. Si en cambio heredas de una subclase MyTestCase:
class MyTestCase(unittest.TestCase):
def assertNotRaises(self, expected_exception, *args, **kwargs):
context = _AssertNotRaisesContext(expected_exception, self)
try:
return context.handle('assertNotRaises', args, kwargs)
finally:
context = None
Todos sus casos de prueba ahora tendrán el assertNotRaisesmétodo disponible para ellos.