คุณสามารถกำหนดassertNotRaisesโดยการนำประมาณ 90% ของการดำเนินงานเดิมของassertRaisesในunittestโมดูล ด้วยวิธีนี้คุณท้ายด้วยวิธีการที่นอกเหนือจากสภาพความล้มเหลวกลับมีพฤติกรรมเหมือนกันกับassertNotRaisesassertRaises
TLDR และการสาธิตสด
มันกลับกลายเป็นassertNotRaisesวิธีที่ง่ายอย่างน่าประหลาดใจในการเพิ่มวิธีการunittest.TestCase(ใช้เวลาประมาณ 4 ครั้งในการเขียนคำตอบนี้ตามที่ใช้รหัส) นี่คือการสาธิตสดของassertNotRaisesวิธีการในการดำเนินการ เพียงเช่นassertRaisesคุณสามารถผ่าน callable และ args ไปassertNotRaisesหรือคุณสามารถใช้มันในwithคำสั่ง การสาธิตสดรวมถึงกรณีทดสอบที่แสดงให้เห็นว่าassertNotRaisesทำงานได้ตามที่ต้องการ
รายละเอียด
การนำไปใช้assertRaisesในunittestค่อนข้างซับซ้อน แต่ด้วย subclassing เล็กน้อยคุณสามารถแทนที่และย้อนกลับเงื่อนไขความล้มเหลว
assertRaisesเป็นวิธีสั้น ๆ ที่โดยทั่วไปแล้วสร้างอินสแตนซ์ของunittest.case._AssertRaisesContextคลาสและส่งคืนมัน (ดูคำจำกัดความของมันในunittest.caseโมดูล) คุณสามารถกำหนด_AssertNotRaisesContextคลาสของคุณเองโดยการแบ่งคลาสย่อย_AssertRaisesContextและแทนที่__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
TestCaseปกติคุณกำหนดชั้นเรียนกรณีทดสอบโดยมีพวกเขาสืบทอดมาจาก หากคุณได้รับมรดกจากคลาสย่อยแทน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
กรณีทดสอบทั้งหมดของคุณตอนนี้จะมีassertNotRaisesวิธีการที่ใช้ได้