Vous pouvez écrire votre propre fonction assertWarns pour encapsuler le contexte catch_warnings. Je viens de l'implémenter de la manière suivante, avec un 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))
Un exemple d'utilisation :
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
)
Le test réussira si au moins un des avertissements émis par your_function
est de type UserWarning.