【问题标题】:django-nose unit testing a celery task ... missing database datadjango-nose 单元测试芹菜任务...缺少数据库数据
【发布时间】:2012-06-12 21:40:13
【问题描述】:

我正在使用 django-nose 为 celery 任务编写单元测试。这是相当典型的;在测试时通过夹具预填充的空白测试数据库 (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

【问题讨论】:

  • 你使用的是什么数据库和什么版本的 celery/django-celery?

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


【解决方案1】:

这听起来很像 django-celery 2.5 中的错误,已在 2.5.2 中修复:https://github.com/celery/django-celery/pull/116

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

【讨论】:

  • 很好看。我正在运行 2.5.1... :-(
  • 我非常熟悉这个错误及其带来的挫败感。我是提交拉取请求的人:)
  • 想知道您是否遇到过类似的问题,即未在测试中存储结果?现在我可以获得更新数据库的急切任务,但结果记录(数据库结果存储)似乎没有被存储。我想知道这是否是交易的副作用......我应该阅读/理解任何文档吗?
  • 我通常会忽略我的任务结果(发送电子邮件、获取 RSS 提要),所以我没有看到结果的问题,但如果是与数据库连接类似的问题,我不会感到惊讶.关于 django-celery 加载器的内部工作的文档并不多,所以我通常直接访问源代码。
  • 发现已经有拉取请求...github.com/celery/django-celery/pull/104
猜你喜欢
  • 2018-01-08
  • 2017-10-14
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 2019-07-21
相关资源
最近更新 更多