Уведомления об авиационном тормозе отключены в тестах Django? - PullRequest
0 голосов
/ 01 июня 2018

Я настроил приложение Django под названием lucy_web для регистрации ошибок на Airbrake, используя pybrake.В модуле в иерархии lucy_web, lucy_web.lib.session_recommendations, я определил функцию тестирования:

import logging

logger = logging.getLogger(__name__)

def log_something():
    logger.error("Logging something...")

Если я вызываю эту функцию из оболочки Django, например:

(venv) Kurts-MacBook-Pro-2:lucy-web kurtpeek$ python manage.py shell
Python 3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.3.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from lucy_web.lib.session_recommendation import *

In [2]: log_something()

Я вижу сообщение об ошибке:

enter image description here

Однако, если я определю тест и попытаюсь вызвать его оттуда, я нене появляется никаких новых случаев появления ошибки:

from django.test import TestCase
from django.core import mail


class SessionRecommendationTestCase(TestCase):
    def test_airbrake_notification_if_session_type_does_not_exist(self):
        from lucy_web.lib.session_recommendation import log_something
        log_something()
        import ipdb; ipdb.set_trace()

Запуск этой команды не привел к появлению каких-либо новых случаев ошибки на приборной панели Airbrake.Кроме того, mail.outbox пусто:

(venv) Kurts-MacBook-Pro-2:lucy-web kurtpeek$ python manage.py test lucy_web.tests.test_session_recommendation.SessionRecommendationTestCase.test_airbrake_notification_if_session_type_does_not_exist
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
--Return--
None
> /Users/kurtpeek/Documents/Dev/lucy2/lucy-web/lucy_web/tests/test_session_recommendation.py(377)test_airbrake_notification_if_session_type_does_not_exist()
    375         from lucy_web.lib.session_recommendation import log_something
    376         log_something()
--> 377         import ipdb; ipdb.set_trace()

ipdb> mail.outbox
[]

Как я понимаю из https://docs.djangoproject.com/en/2.0/topics/testing/tools/#email-services, в рамках теста, Django перенаправляет всю электронную почту, отправленную Django, в фиктивную папку исходящих сообщений mail.outbox.Я не ожидал бы этого в случае с Airbrake, хотя, поскольку электронные письма, вероятно, отправлялись их бэкэндом - и если бы это было так, я бы не ожидал, что mail.outbox будет пустым.

ПочемуЯ не получаю уведомления Airbrake для теста?Это что-то более общее, например, что все журналы отключены / захвачены во время теста?

1 Ответ

0 голосов
/ 02 июня 2018

Я установил трассировку в методе pybrake.Notifier s send_notice, что он не вызывается в модульном тесте, тогда как это происходит, когда я вызываю функцию «вручную» из оболочки Django.

Чтобы по-прежнему получать тестовое покрытие, я обошел эту проблему, просто утверждая, что вызывается logger.error:

from django.test import TestCase
from unittest.mock import patch

class SessionRecommendationTestCase(TestCase):
    @patch('lucy_web.lib.session_recommendation.logger.error')
    def test_create_session_from_non_existent_session_type_title_triggers_error_logging(self, mock_error):
        title = "Being Awesome"    # Title of a non-existent session type
        _create_sessions([title])
        mock_error.assert_called_with(
            f"Tried to create a session of type '{title}', but no such session type was found in the database.")

, где это реальная функция, которую я пытаюсь протестировать:

def _create_sessions(title_list, starting_number=1, **kwargs):
    '''Auxiliary function to create sessions from a list of SessionType titles'''
    session_number = starting_number
    for title in title_list:
        session_type = SessionType.objects.filter(title=title).first()
        if session_type:
            Session.objects.create(
                session_type=session_type,
                session_number=session_number,
                **kwargs)
            session_number += 1
        else:
            logger.error(
                f"Tried to create a session of type "
                f"'{title}', but no such session type was found in the database.")

Этот тест проходит:

(venv) Kurts-MacBook-Pro-2:lucy-web kurtpeek$ python manage.py test lucy_web.tests.test_session_recommendation.SessionRecommendationTestCase.test_create_session_from_non_existent_session_type_title_triggers_error_logging
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.004s

OK
Destroying test database for alias 'default'...
...