2013-03-01 2 views
24

Ich verwende Django-Rest-Framework (neueste) für REST-API, und implementiert einige Testfälle in Django mit eingebauten Test-Client.django-rest-framework http setzen fehlgeschlagen mit 415 auf django 1.5

folgenden django Testfall wurde mit django Version < 1,5

self.client.put('/core/accounts/%s/'% self.account.id, 
     data = prepare_dict(self.account), 
     HTTP_AUTHORIZATION=self.token) 

verbesserte Feinwerk 1,5 bis django, alle Tests außer Tests HTTP PUT Zusammenhang geben werden, während in der Frage der Suche fanden diese @https://docs.djangoproject.com/en/dev/releases/1.5/#options-put-and-delete-requests-in-the-test-client

Wenn Sie den Datenparameter in einer PUT-Anfrage unter Verwendung wurden ohne content_type, müssen Sie Ihre Daten verschlüsseln, bevor er es auf den Test Client und legen Sie das Argument content_type.

Also, aktualisiert meinem Test diese Änderung widerzuspiegeln und versuchte folgenden, aber immer noch http bekommen 415 statt http 200

from django.test.client import MULTIPART_CONTENT, BOUNDARY, encode_multipart 
self.client.put('/core/accounts/%s/'% self.account.id, 
      data = encode_multipart(BOUNDARY, prepare_dict(self.account)), 
       content_type=MULTIPART_CONTENT, 
     HTTP_AUTHORIZATION=self.token) 

Jede Idee, was ich fehle? PS: Alle Funktionen funktionieren gut von django-Rest-Rahmen integrierten Web-UI

Antwort

32

Sie sind absolut auf dem richtigen Weg - der Bruchtest in diesem Fall sicherlich Änderung aufgrund Djangos in PUT Verhalten für den Test ist Klient.

Ihre Korrektur sieht direkt zu mir auch. 415 ist die Antwort "Nicht unterstützter Medientyp", was bedeutet, dass der Inhaltstyp der Anfrage nicht von einem der für die Ansicht konfigurierten Parser verarbeitet werden konnte.

Normalerweise wie dies im Falle, dass auf Grund würde zu vergessen die Art des Inhalts des Antrags zu setzen, aber es sieht so aus, dass Sie das richtig eingestellt multipart/form-data; boundary=... haben

Aktivitäten überprüfen:

  • Genau was zeigt response.data als Fehlerdetails?
  • Was haben Sie in Ihrer Einstellung konfiguriert, wenn Sie eine haben, oder was haben Sie auf das View-Attribut parser_classes gesetzt, wenn es eins hat?
  • Stellen Sie sicher, dass es im Test keinen Tippfehler gibt (content_type) (obwohl es hier korrekt ist).

bearbeiten:

Vielen Dank für Ihre Kommentare - das alles aufräumt. Sie haben nur den JSON-Parser installiert, aber Sie versuchen, formcodierte Daten zu senden. Sie sollten entweder:

  • hinzufügen FormParser und MultiPartParser, um Ihre Einstellungen/Ansicht, so dass es Form Kodierungen unterstützt.(Beachten Sie auch, dass die Standard-DEFAULT_PARSER_CLASSES Einstellung nicht sie gehören, wenn Sie also nicht alles überhaupt gesetzt werden es wie erwartet)

Oder

  • Encode die Anfrage mit json Codierung, nicht Formular-Codierung ... data=json.dumps(prepare_dict(self.account)), content_type='application/json' in Ihrem Testfall.
+1

Tom, vor allem danke für Djnago-Rest-framwork. Wie Sie gefragt haben, habe ich überprüft. response.data = {u'detail ': u "Nicht unterstützter Medientyp" multipart/form-data; boundary = BoUnDaRyStriNg' in request. "} 2. Standard-Parser auf 'rest_framework.parsers.JSONParser' gesetzt 3. Keine parser_classes als Ansicht Attribut. –

+0

set parser_classes = (JSONParser,) für die Ansicht, aber keinen Unterschied –

+1

OK, Entfernen von default_parser (JSON) aus den Einstellungen hat die Magie. Beim Einrahmen in das Framework kann diese Zeile in [email protected] parser = self.negotiator.select_parser (self, self.parsers) nicht den richtigen Parser aushandeln, wenn der Standardparser (JSON) gesetzt ist und der Inhaltstyp 'multipart/form' ist -data ' –