2017-05-30 10 views
1

Ich versuche einen Test zu schreiben, um zu sehen, ob mein Login auf die richtige Seite umleitet. Im Moment habe ich diesen Code verwende, die nicht funktioniert:Testing Login Redirect

class TestAuth(TestCase): 
    def setUp(self): 
     self.client = Client() 

    @classmethod 
    def setUpTestData(cls): 
     user_login = get_user_model().objects.create(username='admin', email='[email protected]', password='asdf1234') 

     cls.user_login = user_login 

    def test_login_redirect(self): 
     response = self.client.post(
      reverse('udt:login'), 
      { 
       'username': 'admin', 
       'password': 'asdf1234' 
      } 
     ) 

     self.assertRedirects(response, reverse('udt:table_list')) 

wo udt:login zu '/udt/accounts/login/' entspricht und udt:table_list entspricht '/udt/table/'.

Die Login-Funktion ist die integrierte Anmeldung von Django mit einer benutzerdefinierten Vorlage. Wenn ich den Test ausführen bekomme ich folgende Fehlermeldung:

AssertionError: 200 != 302 : Response didn't redirect as expected: Response code was 200 (expected 302) 

Allerdings, wenn ich in der App die Login-Funktionalität tatsächlich testen bekomme ich dies:

[2017/05/30 14:43:22] HTTP POST /udt/accounts/login/ 302 [0.13, 127.0.0.1:60127] 
[2017/05/30 14:43:22] HTTP GET /udt/table/ 200 [0.15, 127.0.0.1:60127] 

mir, die wie es scheint in der Tat richtig umleiten.

Also ist meine Frage, was ist falsch mit meinem Test, der den Assertion Fehler verursacht? Ich bin ziemlich neu in Django zu testen, also könnte es etwas sein, das ich vermisse, aber es scheint so, als ob der Test an mich übergeben werden sollte.

Jede Hilfe mit diesem würde sehr geschätzt werden.

UPDATE

Das Login-Template sieht wie folgen aus (nahm nur die Standard-Login-Vorlage Django und hinzugefügt, um es einige Bootstrap-Klassennamen):

{% load bootstrap3 %} 

<form id="login-form" method="post" action="{% url 'udt:login' %}"> 
    {% csrf_token %} 
    <table class="table"> 
     <tr> 
      <td><label for="id_username">Username</label></td> 
      <td><input id="id_username" name="username" type="text" class="form-control"></td> 
     </tr> 
     <tr> 
      <td><label for="id_password">Password</label></td> 
      <td><input id="id_password" name="password" type="password" class="form-control"></td> 
     </tr> 
    </table> 
    {% if form.errors %} 
     <p class=" label label-danger"> 
      Your username and password didn't match. 
      Please try again. 
     </p> 
    {% endif %} 
    <input type="submit" value="Login" class="btn btn-primary pull-right" /> 
    <input type="hidden" name="next" value="{{ next }}" /> 
</form> 

url für die Anmeldung wie so aussehen:

url(r'^login/$', auth_views.login, {'template_name': 'auth/login.html'}, name='login') 

Ich verwende Django v.1.11.1.

+0

ich nicht, dass Sie mit dem Test helfen, aber ich denke, der beste Weg, um das zu erreichen, was du tust, ist einfach diese Zeile in deine settings.py 'LOGIN_REDIRECT_URL = '/ YourSite /'' Dies funktioniert zu 100%. – hansTheFranz

+0

Ich habe das bereits in meiner settings.py und ich bekomme immer noch den gleichen Fehler, also bin ich mir nicht wirklich sicher warum es passiert! – BeeNag

+0

In diesem Fall kann ich dir nicht sagen, was falsch ist, sorry. Hoffen wir, dass ein erfahrener Benutzer uns aufklären wird. – hansTheFranz

Antwort

1

Sie erstellen den Benutzer falsch. Sie sollten create_user anstelle von create() verwenden, damit das Kennwort korrekt gehashed wird.

@classmethod 
def setUpTestData(cls): 
    user_login = get_user_model().objects.create_user(username='admin', email='[email protected]', password='asdf1234') 

Als Nebenwirkung, können Sie Ihre setUp Methode entfernen, da es nicht notwendig ist. Djangos TestCase Klasse kümmert sich um die Einrichtung self.client für Sie.

Eine weitere Sache - Ihre URL-Muster ist in Ordnung für Django 1.11, aber man konnte aktualisieren LoginView zu verwenden, um mit Django kompatibel sein 2.1+:

url(r'^login/$', auth_views.LoginView.as_view(template_name= 'auth/login.html'), name='login'), 
+0

Ja, du warst in beiden Punkten richtig! Danke vielmals! – BeeNag