2015-02-25 7 views
11

Ich versuche Tests für das Django Rest Framework zu implementieren. Die meisten meiner Tests bestanden und die Einrichtung ging glatt, aber ich habe jetzt ein Problem, wo ein assertEqual nie erfolgreich ist, weil es JSON mit einem OrderedDict vergleicht.DRF-Test: anstelle von JSON wird ein OrderedDict zurückgegeben

Ich habe keine Ahnung, woher das OrderedDict stammt seit DRF sollte nur JSON zurückgeben (richtig?).

Ist es möglich, dass die Testumgebung den JSON vor dem Vergleich analysiert? Das wäre scheiße.

Ich mache einen integrierten Test, der nur die Daten in der Antwort einer GET-Anfrage auf eine bestimmte Ressource testet, ich mache dies basierend auf JSON-Fixtures. Ich teste keine bestimmte Komponente des REST-Frameworks, da meine Implementierungen der Komponenten so einfach sind, dass sie bereits von den Tests im DRF-Projekt getestet wurden.

Wie auch immer, ich hoffe, jemand kann mir helfen!

+1

Sie müssen genauer sein. Ein Serializer ist dafür zuständig, Ihre Daten in ein Wörterbuch zu konvertieren, und der Renderer wandelt diesen in JSON um. Welches Bit genau testen Sie? –

+1

Editiert es! Ich habe mein Problem bereits gelöst, ich hatte ein Problem in meinen Einbauten.Aber ich bin immer noch neugierig, warum es ein OrderedDict mit JSON und nicht JSON mit JSON vergleicht, also antworte bitte, wenn du Zeit hast :) – ZvL

+1

Wenn du die Reihenfolge der Schlüssel in deiner Antwort JSON sicherstellen musst, dann kannst du OrderedDict verwenden komponiere deine Antwort. Sobald es durch die Tür und draußen in der Wildnis kommt, wird es zu einem einfachen JSON mit Schlüsseln in einer bestimmten Reihenfolge. Da Sie die Django-Testinfrastruktur verwenden, kommt Ihre Antwort nicht durch die Tür, sondern wird stattdessen in Ihren Testfall zurückgegeben, um von Ihnen inspiziert zu werden. Ein solches Verhalten ermöglicht es, ein Dict (JSON) im Vergleich zu einem OrderedDict zu testen. Normalerweise sollte das kein Problem sein: Einfach auf die einzelnen Tasten achten. – Roba

Antwort

1

Wenn die Tests wie folgt aussehen:

class SomeTests(APITestCase): 
    def test_something(self): 
     response = self.client.get('/something/1') 
     # assertions with response 

Dann Antwort wird sicherlich ein OrderedDict eher als ein JSON-Dokument sein. Glücklicherweise hat Django 1.9 die response.json() Methode (https://docs.djangoproject.com/en/1.9/topics/testing/tools/#django.test.Response.json) eingeführt, so dass Sie die Antwort einfach in JSON konvertieren können. Beachten Sie, dass Sie auch die json-Bibliothek von Python verwenden können.

Der Haken hier ist, dass Djangos Test-Client (der DRF erweitert) ist ein "Dummy-Browser" (https://docs.djangoproject.com/en/1.9/topics/testing/tools/#the-test-client) und funktioniert nicht genau wie ein In-Browser-Framework wie Selen würde. Daher sind HTTP-Aufrufe eigentlich nur simulierte HTTP-Aufrufe, die sich darauf konzentrieren, Ihre Logik und das korrekte Routing/Views/Serializer/etc zu testen. werden benutzt.

0

Sie Ihre Daten in json Dump kann form--

import json 

return Httpresponse (json.dumps (Daten))

+1

danke, das ist die richtige Antwort für django <1.9 – awwester

+0

@awwester, wenn Sie meine Antwort hilfreich finden. Unterstützen Sie mich durch Upvoting. Vielen Dank –

3

Wie erklärt here, ist dies, weil das Standardformat für Anforderungen während der Tests multipart anstelle von json. Sie können das Format angeben, indem Sie es zu Ihrem API-Aufruf bietet etwa so:

response = self.client.get('/something/1', format='json') 

Oder Sie können den Standard-Testanforderungsformat in Ihrem settings.py wie so gesetzt:

REST_FRAMEWORK = { 
    'TEST_REQUEST_DEFAULT_FORMAT': 'json', # Use application/json instead of multipart/form-data requests in tests. 
} 

es zu beheben für alle testet automatisch.

Verwandte Themen