คุณสามารถกำหนดassertNotRaises
โดยการนำประมาณ 90% ของการดำเนินงานเดิมของassertRaises
ในunittest
โมดูล ด้วยวิธีนี้คุณท้ายด้วยวิธีการที่นอกเหนือจากสภาพความล้มเหลวกลับมีพฤติกรรมเหมือนกันกับassertNotRaises
assertRaises
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
วิธีการที่ใช้ได้