在测试Jinja2驱动的Django视图时,如何访问response.context

时间:2009-12-21 19:09:08

标签: django testing jinja2 django-testing

当我使用Django test.client时,我做了类似的事情:

class MyTestCase(TestCase):
    def test_this(self):
        c = self.client
        response = c.get('/')
        assert False, response.context['name']

我收到错误:

assert False, response.context['name']
TypeError: 'NoneType' object is unsubscriptable

我的唯一猜测就是使用Jinja2会阻止我在测试时显示上下文。

请注意,此测试是故意操纵失败的。

4 个答案:

答案 0 :(得分:1)

我一直想在TestCase上阅读。仔细阅读文档后,您可能会遇到错误。断言是TestCase类的方法。

class MyTestCase(TestCase):
  def test_this(self):
    response=self.client.get('/')
    self.assertEquals(response.context['name'],'Jim') 

答案 1 :(得分:1)

Django的猴子补丁 Template类重写render方法,以便能够发送template_rendered信号并填充response.context

如果你挖掘代码,你就可以为Jinja2的Template类做到这一点。

答案 2 :(得分:1)

我已经完成了@Rho建议的方式(在页面加载测试文件的开头)

from jinja2 import Template as Jinja2Template
from django.test import signals

#note - this code can be run only once
ORIGINAL_JINJA2_RENDERER = Jinja2Template.render
def instrumented_render(template_object, *args, **kwargs):
    context = dict(*args, **kwargs)
    signals.template_rendered.send(
                            sender=template_object,
                            template=template_object,
                            context=context
                        )
    return ORIGINAL_JINJA2_RENDERER(template_object, *args, **kwargs)
Jinja2Template.render = instrumented_render

然后您可以选择响应上下文和模板名称(但在这种情况下,response.template不是列表)而不是response.template[0].name,您需要使用response.template.name

答案 3 :(得分:1)

Jinja设置context_data变量,而不是上下文:

response = client.get('/')
print response.context_data