Django根据响应内容测试主页的html

时间:2016-05-21 12:54:50

标签: django django-unittest

如果我有这样的测试......

 def test_home_page_returns_correct_html(self):
        request = HttpRequest()
        response = home_page(request)
        expected_html = render_to_string('home.html', request=request)
        self.assertEqual(response.content.decode(), expected_html)

只要在花括号中添加表单,例如{{ form }}上述测试将失败,因为.html文件不会仅仅响应将呈现表单。从而导致断言不匹配。有没有办法围绕这个,以便我仍然可以测试我的HTML反对响应?

1 个答案:

答案 0 :(得分:6)

您可以将表单实例传递给render_to_string函数:

from django.template import RequestContext
from django.template.loader import render_to_string

form = ModelForm()
context = RequestContext(request, {'form': form})
expected_html = render_to_string('home.html', context)

通常我所做的就是将这种测试分成几个其他测试,如:

使用from django.test import TestCase

def setUp(self):
    self.user = User.objects.create_user('john', 'john@doe.com', '123')
    self.client.login(username='john', password='123')
    self.response = self.client.get(r('home'))

首先测试使用了哪个模板:

def test_template(self):
    self.assertTemplateUsed(self.response, 'home.html')

测试表格:

def test_has_form(self):
    form = self.response.context['form']
    self.assertIsInstance(form, CreateModelForm)

然后我测试HTML的关键部分:

def test_html(self):
    self.assertContains(self.response, '<form')
    self.assertContains(self.response, 'type="hidden"', 1)
    self.assertContains(self.response, 'type="text"', 2)
    self.assertContains(self.response, 'type="radio"', 3)
    self.assertContains(self.response, 'type="submit"', 1)

最后,如果渲染的模板有一个csrf标记:

def test_csrf(self):
    self.assertContains(self.response, 'csrfmiddlewaretoken')