Puede definir assertNotRaises
reutilizando aproximadamente el 90% de la implementación original de assertRaises
en el unittest
módulo. Con este enfoque, terminas con un assertNotRaises
mé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 assertNotRaises
mé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 assertNotRaises
método en acción . Al igual queassertRaises
, puede pasar un invocable y argumentos a assertNotRaises
, o puede usarlo en una with
declaración. La demostración en vivo incluye una prueba de casos que demuestra que assertNotRaises
funciona según lo previsto.
Detalles
La implementación de assertRaises
in unittest
es bastante complicada, pero con un poco de subclases inteligentes puede anular e invertir su condición de falla.
assertRaises
es un método corto que básicamente solo crea una instancia de la unittest.case._AssertRaisesContext
clase y la devuelve (consulte su definición en el unittest.case
módulo). Puede definir su propia _AssertNotRaisesContext
clase subclasificando _AssertRaisesContext
y 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 assertNotRaises
método disponible para ellos.