无法修补logging.Logger.info在celery任务中调用

时间:2019-05-04 01:15:08

标签: python logging mocking celery pytest

我想测试使用logger.info API调用某个特定的celery任务时是否恰好一次调用了delay()

我想通过修补logger.info来进行测试。

我要针对Product.order情况https://docs.celeryproject.org/en/latest/userguide/testing.html按此处所述进行测试。

设置为:ubuntu 16.04上的python 2.7。芹菜4.3.0,pytest 4.0.0,模拟3.0.3。

我具有以下文件系统结构:

poc/
   prj/
     -celery_app.py
     -tests.py

celery_app.py

from __future__ import absolute_import

from celery import Celery

from celery.utils.log import get_task_logger

app = Celery('celery_app')

logger = get_task_logger(__name__)


@app.task(bind=True)
def debug_task(self):

    logger.info('Request: {0!r}'.format(self.request))

tests.py

from __future__ import absolute_import

from mock import patch

from prj.celery_app import debug_task


@patch('logging.Logger.info')
def test_log_info_is_called_only_once_when_called_sync(log_info):
    debug_task()
    log_info.assert_called_once()


@patch('logging.Logger.info')
def test_log_info_is_called_only_once_when_called_async(log_info):
    debug_task.delay()
    log_info.assert_called_once()

我希望两项测试都能成功。 相反,第一个成功,而第二个失败,AssertionError: Expected 'info' to have been called once. Called 0 times.

我希望在两种情况下,logger.info上下文中的表达式debug_task()的求值都为<MagicMock name='info' id='someinteger'>,在第二种情况下,它的求值为<bound method Logger.info of <logging.Logger object at 0x7f894eeb1690>>,不显示修补。

我知道在第二种情况下,芹菜工作者在线程内执行任务。

我要求一种在执行logger.info时修补debug_task.delay()调用的方法。

预先感谢您的回答。

0 个答案:

没有答案