我们的系统中有一个继承自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.4
,celery==3.1.18
和django-celery==3.1.16
的更新环境中对其进行了测试,并遇到了同样的问题。