django-nose单元测试芹菜任务...缺少数据库数据

时间:2012-06-08 20:08:03

标签: django unit-testing django-celery django-nose

我正在使用django-nose为芹菜任务编写单元测试。这很典型;空白测试数据库(REUSE_DB = 0),在测试时通过夹具预先填充。

我遇到的问题是即使TestCase正在加载fixture并且我可以从测试方法访问对象,在异步芹菜任务中执行时同样的查询也会失败。

我已经检查过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

1 个答案:

答案 0 :(得分:2)

这听起来很像django-celery 2.5中的一个错误,修正了2.5.2:https://github.com/celery/django-celery/pull/116

该错误的简要描述是django-celery加载程序在执行任务之前关闭数据库连接,甚至是急切的任务。由于测试在事务内部运行,因此任务执行的新连接无法看到setUp中创建的数据。