Bạn có thể xác định assertNotRaisesbằng cách sử dụng lại khoảng 90% việc thực hiện ban đầu assertRaisestrong unittestmô-đun. Với phương pháp này, bạn kết thúc với một assertNotRaisesphương pháp, ngoài điều kiện thất bại đảo ngược của nó, hành xử giống hệt nhau assertRaises.
TLDR và bản demo trực tiếp
Hóa ra thật dễ dàng để thêm một assertNotRaisesphương thức vào unittest.TestCase(tôi mất khoảng 4 lần thời gian để viết câu trả lời này giống như đã làm mã). Đây là bản demo trực tiếp của assertNotRaisesphương thức đang hoạt động . Giống nhưassertRaises , bạn có thể chuyển một cuộc gọi và tranh luận assertNotRaiseshoặc bạn có thể sử dụng nó trong một withtuyên bố. Bản demo trực tiếp bao gồm một trường hợp thử nghiệm chứng minh rằng assertNotRaiseshoạt động như dự định.
Chi tiết
Việc thực hiện assertRaisestrong unittestkhá phức tạp, nhưng với một chút phân lớp thông minh, bạn có thể ghi đè và đảo ngược tình trạng lỗi của nó.
assertRaiseslà một phương thức ngắn về cơ bản chỉ tạo một thể hiện của unittest.case._AssertRaisesContextlớp và trả về nó (xem định nghĩa của nó trong unittest.casemô-đun). Bạn có thể định nghĩa _AssertNotRaisesContextlớp của riêng mình bằng cách phân lớp _AssertRaisesContextvà ghi đè __exit__phương thức của nó :
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
Thông thường bạn định nghĩa các lớp trường hợp kiểm tra bằng cách chúng kế thừa từ TestCase. Nếu bạn thay vì kế thừa từ một lớp con 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ất cả các trường hợp thử nghiệm của bạn bây giờ sẽ có assertNotRaisesphương thức có sẵn cho họ.