Você pode definir assertNotRaisesreutilizando cerca de 90% da implementação original assertRaisesno unittestmódulo. Com essa abordagem, você acaba com um assertNotRaisesmé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 assertNotRaisesmé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 assertNotRaisesmétodo em ação . Assim comoassertRaises , você pode passar um call e args para assertNotRaises, ou você pode usá-lo em uma withdeclaração. A demonstração ao vivo inclui casos de teste que demonstram que assertNotRaisesfuncionam conforme o esperado.
Detalhes
A implementação de assertRaisesin 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._AssertRaisesContextclasse e a retorna (veja sua definição no unittest.casemódulo). Você pode definir sua própria _AssertNotRaisesContextclasse subclassificando _AssertRaisesContexte 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 assertNotRaisesmétodo disponível para eles.