Sen tanımlayabilirsiniz assertNotRaisesorijinal uygulanması% 90 yaklaşık yeniden kullanarak assertRaisesiçinde unittestmodül. Bu yaklaşımla, assertNotRaisesters başarısızlık durumunun yanı sıra aynı şekilde davranan bir yöntem elde edersiniz assertRaises.
TLDR ve canlı demo
Bir assertNotRaisesyö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 assertNotRaisesveya bir onu kullanabilirsiniz withaçıklamada. Canlı demo, assertNotRaisesamaçlandığı gibi çalıştığını gösteren bir test örneği içerir .
ayrıntılar
Uygulanması assertRaiseshalinde unittestoldukça karmaşık, fakat zeki subclassing birazcık ile geçersiz kılmak ve başarısızlık durumunu tersine çevirebilir.
assertRaisestemel olarak unittest.case._AssertRaisesContextsınıfın bir örneğini oluşturan ve onu döndüren kısa bir yöntemdir ( unittest.casemodülün tanımına bakın ). Kendi _AssertNotRaisesContextsınıfınızı yöntemini alt sınıflandırarak _AssertRaisesContextve 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 assertNotRaisesyöntemlerin kullanabileceği bir yöntem bulunacaktır .