test_valid_comment_data 中,我们构造合法的评论内容并提交,预期结果是评论提交成功后重定向到被评论文章的详情页,所以使用了 assertRedirects 进行断言。
注意 self.client.post(self.url, valid_data, follow=True) 传入的 follow=True 参数。由于评论成功后需要重定向,因此传入 follow=True,表示跟踪重定向,因此返回的响应,是最终重定向之后返回的响应(即被评论文章的详情页),如果传入 False,则不会追踪重定向,返回的响应就是一个响应码为 302 的重定向前响应。
对于重定向响应,使用 assertRedirects 进行断言,这个断言方法会对重定向的整个响应的过程进行检测,默认检测的是响应码从 302 变为 200。
测试模板标签上一篇中介绍过模板标签的测试方法。基本套路就是代替 django 视图函数自动渲染模板内容的过程,手工构造一个包含待测试模板标签的模板,然后手工渲染其内容,断言渲染后的内容是否包含预期的内容。具体代码请看源代码,这里不再一一讲解,只将涉及的几个新的表单操作进行一个简单介绍。
class CommentExtraTestCase(CommentDataTestCase): # ...省略其它测试用例的代码 def test_show_comment_form_with_invalid_bound_form(self): template = Template( '{% load comments_extras %}' '{% show_comment_form post form %}' ) invalid_data = { 'email': 'invalid_email', } form = CommentForm(data=invalid_data) self.assertFalse(form.is_valid()) context = Context(show_comment_form(self.ctx, self.post, form=form)) expected_html = template.render(context) for field in form: label = '<label for="{}">{}:</label>'.format(field.id_for_label, field.label) self.assertInHTML(label, expected_html) self.assertInHTML(str(field), expected_html) self.assertInHTML(str(field.errors), expected_html)看到循环表单 form 的语句:
for field in form: label = '<label for="{}">{}:</label>'.format(field.id_for_label, field.label)我们这里使用了 field 的两个属性,id_for_label 和 id_for_label,分别是 django 表单自动生成的表单字段 label 的 id 和 label 名。别的就没什么好说的了,就是不停地断言页面包含预期的 HTML 内容。
至此,我们完成了对 blog 应用和 comment 应用这两个核心 app 的测试。现在,我们想知道的是,到底我们的测试效果怎么样呢?测试充分吗?测试全面吗?还有没有没有测到的地方呢?
单凭肉眼观察难以回答上面的问题,接下来我们就借助一个工具,从代码覆盖率的角度来检测一下我们的测试效果究竟如何。
HelloDjango 往期回顾:第 28 篇:Django Haystack 全文检索与关键词高亮
第 27 篇:开启 Django 博客实现简单的全文搜索
关注公众号加入交流群