Sie können definieren, assertNotRaisesindem Sie etwa 90% der ursprünglichen Implementierung von assertRaisesim unittestModul wiederverwenden . Mit diesem Ansatz erhalten Sie eineassertNotRaises Methode, die sich, abgesehen von ihrem umgekehrten Fehlerzustand, identisch verhält assertRaises.
TLDR und Live-Demo
Es stellt sich als überraschend einfach heraus, eine assertNotRaisesMethode hinzuzufügen unittest.TestCase(ich habe ungefähr viermal so lange gebraucht, um diese Antwort zu schreiben wie den Code). Hier ist eine Live-Demo der assertNotRaisesMethode in Aktion . Genau wieassertRaises können Sie entweder eine aufrufbare und args passieren zu assertNotRaises, oder Sie können es in einer verwenden withAussage. Die Live-Demo enthält Testfälle, die dies demonstrierenassertNotRaises wie beabsichtigt funktioniert.
Einzelheiten
Die Umsetzung von assertRaisesinunittest ist ziemlich kompliziert, aber mit ein wenig cleverer Unterklasse können Sie den Fehlerzustand überschreiben und umkehren.
assertRaisesist eine kurze Methode, die im Grunde nur eine Instanz der unittest.case._AssertRaisesContextKlasse erstellt und zurückgibt (siehe Definition im unittest.caseModul). Sie können Ihre eigene _AssertNotRaisesContextKlasse definieren, indem Sie _AssertRaisesContextihre __exit__Methode unterordnen und überschreiben :
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
Normalerweise definieren Sie Testfallklassen, indem Sie sie erben lassen TestCase. Wenn Sie stattdessen von einer Unterklasse erben 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
Allen Ihren Testfällen steht jetzt die assertNotRaisesMethode zur Verfügung.