【发布时间】:2014-04-02 01:36:15
【问题描述】:
我正在尝试为我的 Django 应用程序中的一些 celery 任务编写一些单元测试。这些任务以模型 id 作为参数,做一些事情,并更新模型。运行 devserver 和 celery worker 时,一切正常,但是在运行我的测试时,很明显 celery 任务没有使用作为测试运行的一部分创建和销毁的 django 测试数据库。问题是,我怎样才能让 celery 使用与我的其余测试相同的临时数据库?
如您所见,对于类似问题,我正在使用每个答案中建议的设置覆盖。
更新:发现不是将对象 id 传递给任务并让任务从数据库中获取它,如果我只是将对象本身传递给任务,测试可以正常工作,显然不会对任务的功能产生不利影响任务。所以至少现在,这将是我的解决方案。
在我的测试中:
class JobTest(TestCase):
@override_settings(CELERY_ALWAYS_EAGER=True,
CELERY_EAGER_PROPAGATES_EXCEPTIONS=True,
BROKER_BACKEND='memory')
def test_Job_Complete(self):
job = models.Job()
job.save()
tasks.do_a_thing(job.id)
self.assertTrue(job.complete)
在我的任务中:
@celery.task
def do_a_thing(job_id):
job = models.Job.objects.get(pk=job_id)
bunch_of_things(job)
job.complete = True
job.save()
【问题讨论】:
-
但是,在任务中传入对象本身可能会给您带来副作用,例如恢复曾经保存的数据等。这仍然是您的解决方案还是您有其他解决方案?
-
不幸的是,传递对象本身对我不起作用,因为它包含 ManyToManyFields。 m2m 字段的内容未正确传输到任务。
标签: python django unit-testing celery django-celery