Sen tanımlayabilirsiniz assertNotRaises
orijinal uygulanması% 90 yaklaşık yeniden kullanarak assertRaises
içinde unittest
modül. Bu yaklaşımla, assertNotRaises
ters başarısızlık durumunun yanı sıra aynı şekilde davranan bir yöntem elde edersiniz assertRaises
.
TLDR ve canlı demo
Bir assertNotRaises
yöntem eklemek şaşırtıcı derecede kolay çıkıyor unittest.TestCase
(bu yanıtı kod yazarken yazmak yaklaşık 4 kat sürdü). İşte metodun canlı bir demosuassertNotRaises
. Sadece gibiassertRaises
, ya bir çağrılabilir ve args geçebilir assertNotRaises
veya bir onu kullanabilirsiniz with
açıklamada. Canlı demo, assertNotRaises
amaçlandığı gibi çalıştığını gösteren bir test örneği içerir .
ayrıntılar
Uygulanması assertRaises
halinde unittest
oldukça karmaşık, fakat zeki subclassing birazcık ile geçersiz kılmak ve başarısızlık durumunu tersine çevirebilir.
assertRaises
temel olarak unittest.case._AssertRaisesContext
sınıfın bir örneğini oluşturan ve onu döndüren kısa bir yöntemdir ( unittest.case
modülün tanımına bakın ). Kendi _AssertNotRaisesContext
sınıfınızı yöntemini alt sınıflandırarak _AssertRaisesContext
ve geçersiz kılarak tanımlayabilirsiniz __exit__
:
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
Normalde, test senaryosu sınıflarını devralmalarını sağlayarak tanımlarsınız TestCase
. Bunun yerine bir alt sınıftan miras alırsanız 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
tüm test senaryolarınızda artık bu assertNotRaises
yöntemlerin kullanabileceği bir yöntem bulunacaktır .