2017-03-22 5 views
0

Ich versuche POST Daten zu einer Sicht in django-rest-framework zu testen, die Authentifizierung erfordert. Aber ich kann nicht. Ich habe viele Fäden vermeintlicher Lösungen gelesen, finde aber keine, die mich lösen.Testen von POST mit Authentifizierung in Django Rest Framework

Serializer:

class ResearcherSerializer(serializers.ModelSerializer): 
    studies = serializers.PrimaryKeyRelatedField(
     many=True, queryset=Study.objects.all() 
    ) 

    class Meta: 
     model = Researcher 
     fields = ('id', 'first_name', 'surname', 'email', 'studies') 

Ausblick:

class ResearcherSerializer(serializers.ModelSerializer): 
    studies = serializers.PrimaryKeyRelatedField(
     many=True, queryset=Study.objects.all() 
    ) 

    class Meta: 
     model = Researcher 
     fields = ('id', 'first_name', 'surname', 'email', 'studies') 

Test:

class ResearcherAPITest(APITestCase): 
    base_url = reverse('api_researchers') 
# ... 

def test_POSTing_a_new_researcher(self): 
    user = User.objects.create(username='lab1', password='nep-lab1') 
    self.client.login(username=user.username, password=user.password) 
    response = self.client.post(
     self.base_url, 
     { 
      'first_name': 'João', 
      'surname': 'das Rosas', 
     } 
    ) 
    self.assertEqual(response.status_code, status.HTTP_201_CREATED) 
    new_researcher = Researcher.objects.first() 
    self.assertEqual(new_researcher.first_name, 'João') 
    self.client.logout() 

erhalte ich diesen Fehler:

FAIL: test_POSTing_a_new_researcher (experiments.tests.test_api.ResearcherAPITest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/caco/Workspace/nep-system/nep/experiments/tests/test_api.py", line 130, in test_POSTing_a_new_researcher 
    self.assertEqual(response.status_code, status.HTTP_201_CREATED) 
AssertionError: 403 != 201 

---------------------------------------------------------------------- 

Hatte gelesen drf Dokumentation zu testen, kann aber nicht sehen, was ich falsch mache.

Antwort

1

Ich glaube nicht, dass Sie nicht auf user.password zugreifen können, wie Sie es versuchen. Auch würde ich einige Ratschläge geben:

  • Da Sie APITestCase verwenden. Versuchen Sie, die Methode setUp zu verwenden, um Ihren Benutzer in der Datenbank zu erstellen. Auf diese Weise können Sie diesen Benutzer in anderen Fällen wiederverwenden.
  • Folgen Sie den Richtlinien von pep8, um Ihren Code zu schreiben. test_POSTing_a_new_researcher ist eine sehr seltsame Methode Name
  • bei factory boy Werfen Sie einen Blick, es könnte Ihr Leben leichter durch den Austausch der Halterung Ansatz

gute Ressource für den Test machen: http://www.obeythetestinggoat.com/

+0

Danke für die Tipps Mann. Ich habe hier verifiziert und user.password ist erreichbar. By the way, ich lerne Django TDD mit http://www.obeythetestinggoat.com/, eine großartige Ressource. Aber es gibt einen schnellen Anhang, der insbesondere Test-API und 'django-rest-framework' abdeckt. Keine Authentifizierungstests Trotzdem danke für die Hilfe. – Caco

1

Basis auf dem Testfall Sie‘ ve geschrieben der Testbenutzer ist nicht angemeldet, weil Sie versuchen, einen Benutzer mit dem Hash-Passwort und nicht die nep-lab1 anmelden. Sie können testen, ob Sie erfolgreich angemeldet haben von:

print self.client.login(username=user.username, password=`nep-lab1`) 
# True if logged in and False if not 

und da der Benutzer den Test nicht angemeldet ist, eine neue Forscher über api FORBIDDEN (403) über die Entsendung HTTP-Antwort und nicht CREATED (201) ergäbe

+0

Tatsächlich gibt das Drucken von 'user.password' 'nep-lab1'. Ich habe hier festgestellt, dass die korrekte Methode zum Erstellen von Benutzern mit [User.objects.create_user()] (https://docs.djangoproject.com/en/1.10/topics/auth/default/# creating-users) und nicht 'User.objects.create()' wie gängige Modellklassen. Die erste Methode hat das Passwort für uns. Wie auch immer, danke für die Antwort. Sie haben mich für diesen Fehler geöffnet. – Caco

3

Der richtige Weg, um einen Benutzer zu erstellen, ist User.objects.create_user() als Teach official Django documentation. Bei Verwendung der Methode create_user() wird der Kennwortparameter vor dem Speichern in der Datenbank gehashed, während die allgemeine Methode create() dies nicht tut.

Außerdem ist es notwendig, Login mit

self.client.login(username=user.username, password='nep-lab1') 

statt user.password als password Parameter in APIClient.client.login() Verfahren, wie von @ oz-Haupt hingewiesen.

Verwandte Themen