Sie können definieren, assertNotRaises
indem Sie etwa 90% der ursprünglichen Implementierung von assertRaises
im unittest
Modul 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 assertNotRaises
Methode 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 assertNotRaises
Methode in Aktion . Genau wieassertRaises
können Sie entweder eine aufrufbare und args passieren zu assertNotRaises
, oder Sie können es in einer verwenden with
Aussage. Die Live-Demo enthält Testfälle, die dies demonstrierenassertNotRaises
wie beabsichtigt funktioniert.
Einzelheiten
Die Umsetzung von assertRaises
inunittest
ist ziemlich kompliziert, aber mit ein wenig cleverer Unterklasse können Sie den Fehlerzustand überschreiben und umkehren.
assertRaises
ist eine kurze Methode, die im Grunde nur eine Instanz der unittest.case._AssertRaisesContext
Klasse erstellt und zurückgibt (siehe Definition im unittest.case
Modul). Sie können Ihre eigene _AssertNotRaisesContext
Klasse definieren, indem Sie _AssertRaisesContext
ihre __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 assertNotRaises
Methode zur Verfügung.