Sie können definieren assertNotRaises
durch Wiederverwendung von etwa 90 % der ursprünglichen Implementierung von assertRaises
im unittest
Modul. Mit diesem Ansatz erhalten Sie ein assertNotRaises
Methode, die sich, abgesehen von der umgekehrten Fehlerbedingung, identisch verhält wie assertRaises
.
TLDR und Live-Demo
Es stellt sich heraus, dass es erstaunlich einfach ist, eine assertNotRaises
Methode zu unittest.TestCase
(Ich habe etwa 4 Mal so lange für diese Antwort gebraucht wie für den Code). Hier ist eine Live-Demo des assertNotRaises
Methode in Aktion . Einfach wie assertRaises
können Sie entweder ein Callable und Args an assertNotRaises
oder Sie können es in einer with
Erklärung. Die Live-Demo enthält einen Testfall, der zeigt, dass assertNotRaises
funktioniert wie vorgesehen.
Einzelheiten
Die Umsetzung der assertRaises
en unittest
ist ziemlich kompliziert, aber mit ein wenig geschicktem Subclassing können Sie die Fehlerbedingung außer Kraft setzen und umkehren.
assertRaises
ist eine kurze Methode, die im Grunde nur eine Instanz der unittest.case._AssertRaisesContext
Klasse und gibt sie zurück (siehe ihre Definition in der unittest.case
Modul). Sie können Ihre eigenen _AssertNotRaisesContext
Klasse durch Unterklassifizierung _AssertRaisesContext
und die Überschreibung seiner __exit__
Methode:
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 von 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
haben alle Ihre Testfälle jetzt die assertNotRaises
Methode, die ihnen zur Verfügung steht.