2016-03-29 8 views
0

Ich konnte dieses Problem im IRC nicht lösen, in der Hoffnung, dass ich hier eine Anleitung finden könnte. Ich habe folgenden Test:Unit Testing Bootstrap Modal Redirect

def test_validation_errors_return_hops_list_page(self): 
    response = self.client.post(
     '/beerdb/add/hops', 
     data={ 
      'name': '', 
      'min_alpha_acid': '', 
      'max_alpha_acid': '', 
      'country': '', 
      'comments': '' 
     }, follow=True 
    ) 

    self.assertEqual(response.status_code, 200) 
    self.assertTemplateUsed(response, 'homebrewdatabase/addhops.html') 
    name_validation_error = escape("A hop name is required") 
    min_alpha_acid_error = escape("You must enter a min alpha acid") 
    max_alpha_acid_error = escape("You must enter a max alpha acid") 
    country_error = escape("You must enter a country") 
    comments_error = escape("You must enter a comment") 

    self.assertContains(response, name_validation_error) 
    self.assertContains(response, min_alpha_acid_error) 
    self.assertContains(response, max_alpha_acid_error) 
    self.assertContains(response,country_error) 
    self.assertContains(response, comments_error) 

Es fällt auf self.assertContains(response, name_validation_error). Hier ist die Spur zurück:

Failure 
Traceback (most recent call last): 
File "/Users/USER/workspace/PycharmProjects/hashtagbrews/homebrewdatabase/tests/test_views.py", line 189, in test_validation_errors_return_hops_list_page 
self.assertContains(response, name_validation_error) 
File "/Users/USER/workspace/Envs/hashtagbrews/lib/python3.4/site-packages/django/test/testcases.py", line 398, in assertContains 
msg_prefix + "Couldn't find %s in response" % text_repr) 
AssertionError: False is not true : Couldn't find 'A hop name is required' in response 

Meine Ansicht in views.py macht die hops.html Vorlage mit Fehlern, wenn das Formular ungültig ist:

def addhops(request): 

    add_form = HopForm(request.POST or None) 

    if request.method == 'POST': 
     if add_form.is_valid(): 
      Hop.objects.create(name=request.POST['name'], 
          min_alpha_acid=request.POST['min_alpha_acid'], 
          max_alpha_acid=request.POST['max_alpha_acid'], 
          country=request.POST['country'], 
          comments=request.POST['comments'] 
          ) 
     return redirect('hops_list') 
    else: 
     hops_list = Hop.objects.all() 
     return render(request, 'homebrewdatabase/hops.html', {'hops': hops_list, 'form': add_form}) 
return render(request, 'homebrewdatabase/addhops.html', {'form': add_form}) 

Wenn ich manuell über die Website klicken, erhalte ich genau das, was ich suche nach: einer Umleitung von der modalen zu der Haupt-Hops-Seitenliste mit einer Bootstrap-Alarmbox am oberen Ende, die eine ungeordnete Liste von Fehlern von add_hops.errors enthält. Ich habe die Antwort nach der Postanforderung ausgedruckt (self.client.post('url', data={invalid data})) und es enthält nur das modale Formular. Was wäre die richtige Methode, um diesen Test zu beenden? Oder muss ich meine Formularvalidierung neu schreiben?

+0

löschen Sie Ihr Terminal, fügen Sie 'print response' nach' response = ... 'hinzu und führen Sie dann nur diesen Test aus. Dann überprüfen Sie, was Sie behaupten, ist tatsächlich in der gedruckten Ausgabe - weil Sie bei der ersten Behauptung scheitern, könnte etwas passieren, z. Seite nicht Rendering usw. –

+0

auch gute Idee, URLs anstelle von '/ beerdb/add/Hopfen ' –

+0

Das Problem ist, wie ich vermutete, response.context [' Anfrage ']. Es lautet wie folgt 'Anfrage':

Antwort

0

Das Problem hier, wie in den Kommentaren angegeben, ist, dass der Django-Testclient eine GET-Anforderung für die Ansichtsmethode addhops ausführt, nachdem die Postanforderung ausgeführt wurde. Wenn die Methode nicht POST ist, gibt es gemäß der Ansichtslogik das Bootstrap-modal zurück, das die Formularfehler von Entwurf nicht enthält. Daher wird der Test bei Verwendung des Testclients fehlschlagen. Der Test kann jedoch geändert werden, stattdessen verwenden Sie das Objekt HttpRequest, um ungültige Daten in einer POST-Anforderung zu senden und dann zu bestätigen, dass der Inhalt die Formularfehler enthält. So schrieb ich den Test folgenden zu verwenden, die passes--

def test_validation_errors_return_hops_list_page(self): 
    request = HttpRequest() 

    request.method = 'POST' 
    request.POST['name'] = '' 
    request.POST['min_alpha_acid'] = '' 
    request.POST['max_alpha_acid'] = '' 
    request.POST['country'] = 'USA' 
    request.POST['comments'] = '' 

    response = addhops(request) 

    self.assertEqual(response.status_code, 200) 
    name_validation_error = escape("A hop name is required") 
    min_alpha_acid_error = escape("You must enter a min alpha acid") 
    max_alpha_acid_error = escape("You must enter a max alpha acid") 
    comments_error = escape("You must enter a comment") 

    self.assertContains(response, name_validation_error) 
    self.assertContains(response, min_alpha_acid_error) 
    self.assertContains(response, max_alpha_acid_error) 
    self.assertContains(response, comments_error) 

ich nicht behaupten kann, welche Vorlage als assertTemplateUsed verwendet wurde, ist ein Verfahren, das zu dem Test-Client gehört, aber meine Funktionstests mit Selen sollten genug sein, um Überprüfen Sie, ob die erforderlichen Elemente in der gerenderten Ansicht enthalten sind. Das muss vielleicht in der Zukunft geändert werden, aber für den Moment reicht es, damit zu arbeiten.

+0

froh, dass Sie das sortiert haben. Statt assertTemplateUsed können Sie überprüfen, ob Ihre # form-id in der Antwort enthalten ist. –

+0

Danke, ich werde es versuchen. Ich muss meinen response.content erneut überprüfen, um zu sehen, ob die Modale tatsächlich eintreffen. Ich habe den modalen Inhalt nicht in der gleichen Vorlage gespeichert, sondern die modalen Aufrufe auf die Hauptseite gesetzt und die Modale dann in ihre eigene Vorlage unterteilt . Ich werde wahrscheinlich die Ansichten hinzufügen/bearbeiten und löschen irgendwann enden. –