2016-05-21 5 views
0

Wenn ich einen Test wie so haben ...Testen Django den HTML-Code Ihrer Homepage gegen den Inhalt einer Antwort

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) 

Sobald ich ein Formular in geschweiften Klammern hinzuzufügen, z.B. {{ form }} Der obige Test schlägt fehl, da die HTML-Datei das Formular nicht nur als Antwort ausgeben wird. Dies führt dazu, dass die Assertion nicht übereinstimmt. Gibt es einen Weg dahin, damit ich meinen HTML-Code noch gegen die Antwort testen kann?

+0

render_to_string unterstützt ein Wörterbuch als zweiten Parameter oder verwendet c ontext-Schlüsselwort, das als Kontext zum Rendern der Vorlage verwendet wird. Sie müssen das Formular im Kontextwörterbuch senden. Siehe [django docs] (https://docs.djangoproject.com/de/1.9/topics/templates/#django.template.loader.render_to_string) –

+0

Dies scheint jedoch ein bisschen seltsam zu sein. Es scheint, dass Sie den Code der Ansicht duplizieren und dann überprüfen, ob sie das gleiche Ergebnis liefern. Warum? Was soll das testen? –

Antwort

1

Sie können eine Formularinstanz an die render_to_string Funktion übergeben:

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) 

der Regel, was ich tue, ist diese Art von Test in mehrere andere Tests spalten, wie folgt aus:

Mit from django.test import TestCase

def setUp(self): 
    self.user = User.objects.create_user('john', '[email protected]', '123') 
    self.client.login(username='john', password='123') 
    self.response = self.client.get(r('home')) 

Zuerst testen, welche Vorlage verwendet wurde d:

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

Testen Sie die Form:

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

Und dann teste ich die wichtigsten Teile des 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) 

Schließlich, wenn die gerenderte Vorlage hat eine csrf token:

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