在Django单元测试中覆盖模板上下文的Celery任务

时间:2016-04-18 10:11:30

标签: django celery django-celery

我们的系统中有一个继承自DetailView的视图,让我们称之为DataView。它从数据库中获取一些数据,将其添加到上下文并呈现模板。由于有时数据量可能非常大,我一直在研究Celery任务来获取数据,所以现在视图会做类似的事情:

... task_id = self.delay_task() // This returns the task id context.update({ 'task_id': task_id, 'data': None, }) return self.render_to_response(context)

然后,通过一些JavaScript和对另一个视图的AJAX调用,我就可以获得任务结果(相同的模板,这次使用数据呈现)。非常简单,一切都在我的本地服务器上按预期工作:最初页面不包含任何数据,最终会使用任务数据进行更新。

当我运行测试时,我会感到惊讶,这些测试会检查模板上下文中是否存在数据,并且所有测试都仍在通过:

... response = self.client.get(reverse('data_view')) self.assertEqual(response.context['data']['some_key'], some_value)

我已经意识到response.context现在应该包含{'data': None}键值对,当我在任务内部render_to_response调用时,它会被更新/覆盖运行测试。但这对我来说没有意义,而且它与本地服务器上的代码行为完全不一致。我错过了什么?

我们正在为测试设置CELERY_ALWAYS_EAGER = True,我们的生产环境中涉及的软件包的版本是:

Django==1.4.16 celery==2.5.1 django-celery==2.5.1

我还在Django==1.8.4celery==3.1.18django-celery==3.1.16的更新环境中对其进行了测试,并遇到了同样的问题。

0 个答案:

没有答案