Избегать предупреждений на 404 во время тестовых прогонов django? - PullRequest
12 голосов
/ 16 июня 2011

Только что обновлен до Django 1.3.Мой набор тестов теперь показывает кучу бесполезных предупреждений, подобных этому, каждый раз, когда я проверяю, что данный URL-адрес равен 404. Он не делал этого в Django 1.2.

Например, допустим, у нас есть представления и URL-адресаподключен так, что этот тест проходит:

def test_foo(self):
    response = self.client.get('/foo/bar/')
    self.assertEqual(response.status_code, 200)
    response = self.client.get('/foo/bar2/')
    self.assertEqual(response.status_code, 404)

Несмотря на то, что тест пройден, 404 (что мы ожидаем) вызывает предупреждение для консоли:

. ПРЕДУПРЕЖДЕНИЕ Не найдено: / foo /bar2 /

Это просто бесполезный шум;У меня их около 30 в одном из моих текущих наборов тестов.

Есть ли способ заставить замолчать эти только во время тестов ?Я хотел бы оставить их во время нормальной работы.И я не думаю, что хочу отфильтровать все предупреждения от регистратора django.request.

Ответы [ 2 ]

14 голосов
/ 16 июня 2011

Предупреждение приходит отсюда: http://code.djangoproject.com/svn/django/trunk/django/core/handlers/base.py

То, что вы хотите сделать, - это установить порог регистрации модуля 'django.request' на значение выше ПРЕДУПРЕЖДЕНИЯ (например, ОШИБКА) в начале теста, а затем установить его обратно после этого.

Попробуйте что-то вроде этого:

import logging

#before tests
logger = logging.getLogger('django.request')
previous_level = logger.getEffectiveLevel()
logger.setLevel(logging.ERROR)

#after tests
logger.setLevel(previous_level)
6 голосов
/ 06 сентября 2017

Я знаю, что прошло несколько лет, но для тех, кто ищет этот вопрос, может быть полезным следующее.

На основе решения @jterrace вы можете легко реализовать функцию декоратора, например:

import logging

def prevent_request_warnings(original_function):
    """
    If we need to test for 404s or 405s this decorator can prevent the
    request class from throwing warnings.
    """
    def new_function(*args, **kwargs):
        # raise logging level to ERROR
        logger = logging.getLogger('django.request')
        previous_logging_level = logger.getEffectiveLevel()
        logger.setLevel(logging.ERROR)

        # trigger original function that would throw warning
        original_function(*args, **kwargs)

        # lower logging level back to previous
        logger.setLevel(previous_logging_level)

    return new_function

Используя это, вы можете написать свой код так:

@prevent_request_warnings
def test_foo(self):
    response = self.client.get('/foo/bar/')
    self.assertEqual(response.status_code, 200)
    response = self.client.get('/foo/bar2/')
    self.assertEqual(response.status_code, 404)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...