4

当我使用 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

4 回答 4

1

Django 的猴子修补Template覆盖该render方法的类,以便能够发送template_rendered信号和填充response.context

如果您挖掘代码,您将能够为 Jinja2 的模板类执行此操作。

于 2010-08-18T02:29:59.473 回答
1

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

class MyTestCase(TestCase):
  def test_this(self):
    response=self.client.get('/')
    self.assertEquals(response.context['name'],'Jim') 
于 2009-12-21T21:40:09.397 回答
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.

于 2010-09-30T01:09:15.080 回答
1

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

response = client.get('/')
print response.context_data
于 2015-12-31T13:18:57.950 回答