Функция, вызываемая задачей Celery, не имеет вызовов при исправлении в модульном тестировании?

#python #mocking #celery #python-unittest #python-mock

#python #издевательство #celery #python-unittest #python-макет

Вопрос:

Рассмотрим следующий tasks.py модуль (адаптированный из http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html#first-steps ):

 import logging
import sys

from celery import Celery

app = Celery('tasks', broker='pyamqp://guest@localhost//')


@app.task
def add(x, y):
    logging.info(f"Adding {x} and {y}...")
    return x   y


def call_add(x, y):
    add.delay(x, y)
  

В том же каталоге у меня есть test_tasks.py тестовый модуль, который читает

 from unittest.mock import patch

import tasks


@patch('logging.info')
def test_adder(info_mock):
    tasks.call_add(1, 2)

    info_mock.assert_not_called()
  

Этот тест проходит (если я запускаю его с помощью pytest test_tasks.py ), но я не уверен, почему info_mock не был вызван? Я бы ожидал, что следующее утверждение пройдет

 info_mock.assert_called_with("Adding 1 and 2...")
  

Почему в этом примере logging.info не вызывается через tasks.call_add() ? Мне кажется, это эквивалентно примеру, приведенному в http://docs.celeryproject.org/en/latest/userguide/testing.html .

Ответ №1:

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

Celery позволяет очень просто сохранять одни и те же API во время выполнения задачи «синхронизированными» и пропускать нерабочую / рабочую часть.

 app = Celery('tasks', broker='pyamqp://guest@localhost//', task_always_eager=True)
  

http://docs.celeryproject.org/en/latest/userguide/configuration.html#task-always-eager