Вы можете написать свою собственную функцию assertWarns для инкапсуляции контекста catch_warnings. Я только что реализовал это следующим образом, с помощью mixin:
class WarningTestMixin(object):
'A test which checks if the specified warning was raised'
def assertWarns(self, warning, callable, *args, **kwds):
with warnings.catch_warnings(record=True) as warning_list:
warnings.simplefilter('always')
result = callable(*args, **kwds)
self.assertTrue(any(item.category == warning for item in warning_list))
Пример использования:
class SomeTest(WarningTestMixin, TestCase):
'Your testcase'
def test_something(self):
self.assertWarns(
UserWarning,
your_function_which_issues_a_warning,
5, 10, 'john', # args
foo='bar' # kwargs
)
Тест пройдет, если хотя бы одно из предупреждений, выданных your_function
, относится к типу UserWarning.