Ви можете визначити assertNotRaises
шляхом повторного використання близько 90% від первісної реалізації assertRaises
в unittest
модулі. При такому підході ви закінчуєте assertNotRaises
метод, який, окрім його зворотного стану відмови, поводиться однаково assertRaises
.
TLDR та демо-версія
Додавати assertNotRaises
метод до напрочуд легко unittest.TestCase
(мені знадобилося приблизно 4 рази більше часу, щоб написати цю відповідь, як це робив код). Ось жива демонстрація assertNotRaises
методу в дії . Так само, якassertRaises
ви можете або передати позивний і аргумент до assertNotRaises
, або ви можете використовувати його у with
заяві. Демонстраційна демонстрація включає тестові приклади, які демонструють, що assertNotRaises
працює за призначенням.
Деталі
Реалізація assertRaises
в unittest
досить складна, але, маючи трохи розумного підкласингу, ви можете переосмислити та змінити умови його відмови.
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
доступний метод.