Bạn có thể xác định assertNotRaises
bằng cách sử dụng lại khoảng 90% việc thực hiện ban đầu assertRaises
trong unittest
mô-đun. Với phương pháp này, bạn kết thúc với một assertNotRaises
phươ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 assertNotRaises
phươ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 assertNotRaises
phươ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 assertNotRaises
hoặc bạn có thể sử dụng nó trong một with
tuyê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 assertNotRaises
hoạt động như dự định.
Chi tiết
Việc thực hiện assertRaises
trong unittest
khá 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ó.
assertRaises
là một phương thức ngắn về cơ bản chỉ tạo một thể hiện của unittest.case._AssertRaisesContext
lớp và trả về nó (xem định nghĩa của nó trong unittest.case
mô-đun). Bạn có thể định nghĩa _AssertNotRaisesContext
lớp của riêng mình bằng cách phân lớp _AssertRaisesContext
và 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ó assertNotRaises
phương thức có sẵn cho họ.