问题描述
最近在阅读《Python Web开发测试驱动开发》一书, 在本书第4.3章 遵守“不测试常量“规则,使用模板解决这个问题一节中, 介绍了以下方法用以测试是否渲染了正确的模板
from django.template.loader import render_to_string
[...]
def test_home_page_returns_correct_html(self):
request = HttpRequest()
response = home_page(request)
expected_html = render_to_string('home.html')
self.assertEqual(response.content.decode(),expected_html)
在没有读到第5.2节 在服务器中处理POST请求 之前, 该部分代码工作的很好,但是自从在html文件中引入了表单, 加入了{% csrf_token %} 之后, 这个测试就回返回失败。具体的错误信息如下:
self.assertEqual(response.content.decode(), expected_html)
AssertionError: u'<html>\n\t<head>\n\t\t<title>To-Do lists</title>\n\t
</head>\n\t<body>\n\t\t<h1>Your To-Do list</h1>\n\t\t<form method="POST">\n\t\t\t
<input type=\'hidden\' name=\'csrfmiddlewaretoken\' value=\'STBQ2x2wi0xfRKYqRvZT5nzKEYRm3BpnTfXz
ReT26WjvBohO35ef4KynY3Tf4DCe\' />\n\t\t\t<input id="id_new_item" placeholder=
"Enter a to-do item"/>\n\t\t</form>\n\t\t<table id="id_list_table">\n\n\t\t</table>
\n\t</body>\n</html>\n' != u'<html>\n\t<head>\n\t\t<title>To-Do lists
</title>\n\t</head>\n\t<body>\n\t\t<h1>Your To-Do list</h1>\n\t\t<form method="POST">
\n\t\t\t\n\t\t\t<input id="id_new_item" placeholder="Enter a to-do item"/>
\n\t\t</form>\n\t\t<table id="id_list_table">\n\n\t\t</table>\n\t</body>\n</html>\n'
从错误提示信息来看,就是因为引入了{% csrf_token%}的原因导致的 。
解决办法
用百度搜索了一下,大多是反馈,该问题是因为在《Python Web开发测试驱动开发》书中所要求的Django版本是1.8版本, 笔者使用的Django 版本是1.11版本,笔者相信将版本降级到1.8版本肯定可以解决该问题。
但是,没有办法,我懒得去降级
又搜索了一下,结果发现了这个网站
Python Web开发测试驱动开发
貌似是本书的官方网站, 在线上的最新版本上, 作者已经给出了以下解决办法
def test_home_page_returns_correct_html(self):
response = self.client.get('/')
self.assertTemplateUsed(response,'home.html')
实测在Django 1.11 和Python 2.7版本下,可以运行通过。
后话
《Python Web开发测试驱动开发》标价99,记得京东购入好像是61。=.=
有需要的同学,不妨先可以在官网上看一下电子版