Django 根据响应内容测试主页的 html
Django testing the html of your homepage against the content of a response
如果我有这样的测试...
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?
您可以将表单实例传递给 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')
如果我有这样的测试...
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?
您可以将表单实例传递给 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')