首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Django测试中禁用了空气制动通知?

在Django测试中禁用了空气制动通知?
EN

Stack Overflow用户
提问于 2018-06-01 09:50:46
回答 1查看 114关注 0票数 3

我已经配置了一个名为lucy_web的Django应用程序来使用pybrake将错误记录到Airbrake中。在lucy_web层次结构中的一个模块lucy_web.lib.session_recommendations中,我定义了一个测试函数:

代码语言:javascript
复制
import logging

logger = logging.getLogger(__name__)

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

如果我从Django shell调用此函数,如下所示:

代码语言:javascript
复制
(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()

我看到出现一封错误电子邮件:

但是,如果我定义了一个测试,并尝试从那里调用它,我没有看到任何新的错误实例出现:

代码语言:javascript
复制
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()

运行此命令不会导致空气制动仪表板中出现任何新的错误实例。此外,mail.outbox为空:

代码语言:javascript
复制
(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是空的。

为什么我没有收到测试的任何空气制动通知?是不是更通用的东西,比如在测试期间禁用/捕获所有日志记录?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 06:06:45

我通过在pybrake.Notifiersend_notice方法中设置跟踪来验证它不会在单元测试中被调用,而当我从Django shell‘手动’调用函数时,它会被调用。

为了仍然获得测试覆盖率,我解决了这个问题,简单地断言调用了logger.error

代码语言:javascript
复制
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.")

其中,这是我尝试测试的实际函数:

代码语言:javascript
复制
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.")

此测试通过:

代码语言:javascript
复制
(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'...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50635038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档