我想测试使用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()
调用的方法。
预先感谢您的回答。