Модуль django-nose тестирует задачу сельдерея, отсутствующую в базе данных

Я пишу модульные тесты для задачи сельдерея, используя django-nose. Это довольно типично; пустая тестовая база данных (REUSE_DB=0), которая предварительно заполняется через фикстуру во время тестирования.

Моя проблема заключается в том, что, хотя TestCase загружает фикстуру, и я могу получить доступ к объектам из тестового метода, тот же запрос завершается ошибкой при выполнении в рамках асинхронной задачи celery.

Я проверил, что settings.DATABASES["default"]["name"] совпадают как в тестовом методе, так и в тестируемой задаче. Я также подтвердил, что тестируемая задача ведет себя правильно, когда вызывается как обычный вызов метода.

И это о том, где я из идей.

Вот пример:

class MyTest(TestCase):
    fixtures = ['test_data.json']

    def setUp(self):
        settings.CELERY_ALWAYS_EAGER = True # seems to be required; if not I get socket errors for Rabbit
        settings.CELERY_EAGER_PROPAGATES_EXCEPTIONS = True # exposes errors in the code under test.

    def test_city(self):
        self.assertIsNotNone(City.objects.get(name='brisbane'))
        myTask.delay(city_name='brisbane').get()
        # The following works fine: myTask('brisbane')

from celery.task import task

@task()
def myTask(city_name):
    c = City.objects.count() # gives 0
    my_city = City.objects.get(name=city_name) # raises DoesNotExist exception
    return

person Dwight Gunning    schedule 08.06.2012    source источник
comment
Какую базу данных и какую версию celery/django-celery вы используете?   -  person Mark Lavin    schedule 09.06.2012


Ответы (1)


Это очень похоже на ошибку в django-celery 2.5, которая была исправлена ​​в 2.5.2: https://github.com/celery/django-celery/pull/116

Краткое описание ошибки заключается в том, что загрузчик django-celery закрывал соединение с БД перед выполнением задачи, даже нетерпеливой. Поскольку тесты выполняются внутри транзакции, новое соединение для выполнения задачи не может видеть данные, созданные в файле setUp.

person Mark Lavin    schedule 08.06.2012
comment
Красиво подмечено. У меня была версия 2.5.1... :-( - person Dwight Gunning; 10.06.2012
comment
Я хорошо знаком с этой ошибкой и ее разочарованиями. Я был тем, кто отправил запрос на включение :) - person Mark Lavin; 10.06.2012
comment
Хотите знать, сталкивались ли вы когда-нибудь с подобными проблемами, когда результаты тестов не сохранялись? Прямо сейчас я могу получить нетерпеливые задачи по обновлению базы данных, но запись результатов (хранилище результатов базы данных), похоже, не сохраняется. Интересно, является ли это побочным эффектом транзакций... есть ли какие-либо документы, которые я должен читать/понимать? - person Dwight Gunning; 11.06.2012
comment
Обычно я игнорирую результаты своих задач (отправка электронных писем, получение RSS-каналов), поэтому я не видел проблемы с результатами, но меня не удивило бы, если бы это была аналогичная проблема с подключением к БД. На самом деле не так много документации о внутренней работе загрузчика django-celery, поэтому я обычно просто иду прямо к источнику. - person Mark Lavin; 11.06.2012
comment
Обнаружено, что уже есть запрос на включение... github.com/celery/django-celery/pull /104 - person Dwight Gunning; 12.06.2012