我正在尝试在Django中执行单元测试.我有以下表格index.html
:
我正在测试视图是否正确呈现模板:
views.py
def homePage(request): return render(request, 'index.html')
tests.py:
request = HttpRequest() response = homePage(request) if response: response = response.content.decode('UTF-8') expectedHTML = render_to_string('index.html') self.assertEqual(response, expectedHTML)
它response
有一个带有csrf标记的隐藏输入字段; 但是,expectedHTML
没有(在这个地方只有一个空白行{% csrf_token %}
).所以断言总是失败.
是否可以render_to_string()
生成csrf输入字段?如果是这样,那令牌会不会response
像expectedHTML
?
或者,有没有办法忽略输入字段,以便测试可以成功?
要在使用时使csrf令牌工作render_to_string
,您需要提供request
对象以便上下文处理器运行.
在Django 1.8+中,您可以简单地将请求作为参数传递
return render_to_string('index.html', request=request)
在早期版本中,您可以使用RequestContext
.
from django.template import RequestContext render_to_string('index.html', context_instance=RequestContext(request))
不幸的是,Alasdair的答案不适用于每个请求Django 1.10
的csrf_token
更改.请看这个适用于1.10的要点.(改变代码以修复原始要点中的错字)
class HomePageTest(TestCase): @staticmethod def remove_csrf(html_code): csrf_regex = r']+csrfmiddlewaretoken[^>]+>' return re.sub(csrf_regex, '', html_code) def assertEqualExceptCSRF(self, html_code1, html_code2): return self.assertEqual( self.remove_csrf(html_code1), self.remove_csrf(html_code2) )