Anda dapat mendefinisikan assertNotRaises
dengan menggunakan kembali sekitar 90% dari implementasi asli assertRaises
dalam unittest
modul. Dengan pendekatan ini, Anda berakhir dengan assertNotRaises
metode yang, selain dari kondisi kegagalannya yang terbalik, juga berperilaku identik assertRaises
.
TLDR dan demo langsung
Ternyata sangat mudah untuk menambahkan assertNotRaises
metode unittest.TestCase
(butuh saya sekitar 4 kali lebih lama untuk menulis jawaban ini seperti halnya kode). Berikut ini demo langsung dari assertNotRaises
metode yang digunakan . Sama sepertiassertRaises
, Anda bisa menyampaikan callable dan args ke assertNotRaises
, atau Anda dapat menggunakannya dalam sebuah with
pernyataan. Demo langsung mencakup uji kasus yang menunjukkan bahwa assertNotRaises
berfungsi sebagaimana dimaksud.
Detail
Implementasi assertRaises
dalam unittest
cukup rumit, tetapi dengan sedikit subclass pintar Anda dapat menimpa dan membalikkan kondisi kegagalannya.
assertRaises
adalah metode singkat yang pada dasarnya hanya membuat instance dari unittest.case._AssertRaisesContext
kelas dan mengembalikannya (lihat definisi dalam unittest.case
modul). Anda dapat mendefinisikan _AssertNotRaisesContext
kelas Anda sendiri dengan mensubclassing _AssertRaisesContext
dan 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 assertNotRaises
metode yang tersedia untuk mereka.