Anda dapat mendefinisikan assertNotRaisesdengan menggunakan kembali sekitar 90% dari implementasi asli assertRaisesdalam unittestmodul. Dengan pendekatan ini, Anda berakhir dengan assertNotRaisesmetode yang, selain dari kondisi kegagalannya yang terbalik, juga berperilaku identik assertRaises.
TLDR dan demo langsung
Ternyata sangat mudah untuk menambahkan assertNotRaisesmetode unittest.TestCase(butuh saya sekitar 4 kali lebih lama untuk menulis jawaban ini seperti halnya kode). Berikut ini demo langsung dari assertNotRaisesmetode yang digunakan . Sama sepertiassertRaises , Anda bisa menyampaikan callable dan args ke assertNotRaises, atau Anda dapat menggunakannya dalam sebuah withpernyataan. Demo langsung mencakup uji kasus yang menunjukkan bahwa assertNotRaisesberfungsi sebagaimana dimaksud.
Detail
Implementasi assertRaisesdalam unittestcukup rumit, tetapi dengan sedikit subclass pintar Anda dapat menimpa dan membalikkan kondisi kegagalannya.
assertRaisesadalah metode singkat yang pada dasarnya hanya membuat instance dari unittest.case._AssertRaisesContextkelas dan mengembalikannya (lihat definisi dalam unittest.casemodul). Anda dapat mendefinisikan _AssertNotRaisesContextkelas Anda sendiri dengan mensubclassing _AssertRaisesContextdan menimpa __exit__metodenya:
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
Biasanya Anda mendefinisikan kelas kasus uji dengan meminta mereka mewarisi dari TestCase. Jika Anda sebaliknya mewarisi dari subkelas 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
semua kasus uji Anda sekarang akan memiliki assertNotRaisesmetode yang tersedia untuk mereka.