当我使用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会阻止我在测试时显示上下文。
请注意,此测试是故意操纵失败的。
答案 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