У меня есть некоторые тесты, которые должны считать количество предупреждений повышенным функцией. В Python 2.6 это просто, с помощью
with warnings.catch_warnings(record=True) as warn:
...
self.assertEquals(len(warn), 2)
К сожалению, with
не доступно в Python 2.4, поэтому что еще я мог использовать? Я не могу просто проверить, было ли единственное предупреждение (использующий предупреждение фильтра с action='error'
и try
/catch
), потому что количество предупреждений является значительным.
Я собирался предложить тот же обходной путь, что и Игнасио, чуть более полный пример кода тестирования:
import warnings
def setup_warning_catcher():
""" Wrap warnings.showwarning with code that records warnings. """
caught_warnings = []
original_showwarning = warnings.showwarning
def custom_showwarning(*args, **kwargs):
caught_warnings.append(args[0])
return original_showwarning(*args, **kwargs)
warnings.showwarning = custom_showwarning
return caught_warnings
caught_warnings_list = setup_warning_catcher()
# trigger warning here
assert len(caught_warnings_list) == 1
Вы можете самостоятельно продублировать поведение warnings.catch_warnings ()
. Сохраните текущее значение warnings.showwarning
и замените его функцией, которая сохраняет предупреждение в списке, затем после стандартного тестирования длины списка и затем восстановите warnings.showwarning
.
oldsw = warnings.showwarning
warnings.showwarning = myshowwarning
...
self.assertEquals(len(somewarninglist), 2)
warnings.showwarning = oldsw