Você pode definir assertNotRaises
reutilizando cerca de 90% da implementação original assertRaises
no unittest
módulo. Com essa abordagem, você acaba com um assertNotRaises
método que, além da condição de falha reversa, se comporta de maneira idêntica assertRaises
.
TLDR e demonstração ao vivo
É surpreendentemente fácil adicionar um assertNotRaises
método unittest.TestCase
(levei cerca de 4 vezes mais tempo para escrever essa resposta do que o código). Aqui está uma demonstração ao vivo do assertNotRaises
método em ação . Assim comoassertRaises
, você pode passar um call e args para assertNotRaises
, ou você pode usá-lo em uma with
declaração. A demonstração ao vivo inclui casos de teste que demonstram que assertNotRaises
funcionam conforme o esperado.
Detalhes
A implementação de assertRaises
in unittest
é bastante complicada, mas com uma subclasse inteligente, você pode substituir e reverter sua condição de falha.
assertRaises
é um método curto que basicamente apenas cria uma instância da unittest.case._AssertRaisesContext
classe e a retorna (veja sua definição no unittest.case
módulo). Você pode definir sua própria _AssertNotRaisesContext
classe subclassificando _AssertRaisesContext
e substituindo seu __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 você define classes de caso de teste, herdando-as de TestCase
. Se você herdar de uma subclasse 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 os seus casos de teste agora terão o assertNotRaises
método disponível para eles.