tutorial framework delete apiview json django rest django-rest-framework

framework - Pruebas de DRF: en lugar de JSON, se devuelve un OrderedDict



django rest framework serializer (5)

Estoy tratando de implementar pruebas para el marco de descanso de Django. La mayoría de mis pruebas se aprobaron y la configuración se realizó sin problemas, pero ahora tengo un problema donde un assertEqual nunca tiene éxito porque sigue comparando JSON con un OrderedDict.

No tengo ni idea de dónde proviene OrderedDict, ya que DRF solo debe devolver JSON (¿verdad?).

¿Podría ser posible que el entorno de prueba esté analizando el JSON antes de la comparación? Eso apestaría.

Estoy haciendo una prueba integrada que solo prueba los datos en la respuesta de una solicitud GET a un determinado recurso, lo hago en base a los accesorios JSON. No estoy probando un componente específico del marco de REST ya que mis implementaciones de los componentes son tan simples que ya están probadas por las pruebas en el proyecto DRF.

De todos modos, espero que alguien me pueda ayudar!


Como se explica here , esto se debe a que el formato predeterminado para las solicitudes durante las pruebas es multipart lugar de json . Puede especificar el formato proporcionándolo a su llamada de api de la siguiente manera:

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

O puede configurar el formato de solicitud de prueba predeterminado en su settings.py manera:

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

Para arreglarlo para todas tus pruebas automágicamente.



Puedes volcar tus datos en forma json--

import json

devolver HttpResponse (json.dumps (data))


Resolví el problema usando SerializerMethodField .

Simplemente, dentro de la clase de serializador, copie las últimas 3 líneas y reemplace el result con el miembro json que causa el problema

class ConfigSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Config fields = (''id'', ''url'', ''email'', "result",) # COPY NEXT 3 LINES AND CHANGE ''result'' WITH THE JSON MEMBER THAT CAUSE THE PROBLEM result = serializers.SerializerMethodField() def get_result(self, obj): return obj.result

Antes de que el result muestre como:

{result: "OrderedDict([(''key1'', 1), (''key2'', OrderedDict([(''key3'', [1, 2, 3])]))])"}

Después de la solución, el result convierte en:

{"result": {"key1":1,"key2":{"key3":[1,2,3]}}}


Si tus pruebas se ven algo como esto:

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

Entonces, la respuesta será ciertamente un OrderedDict en lugar de un documento JSON. Afortunadamente, Django 1.9 ha introducido el método response.json() ( https://docs.djangoproject.com/en/1.9/topics/testing/tools/#django.test.Response.json ) para que pueda convertir fácilmente la respuesta en JSON. Tenga en cuenta que también podría utilizar la biblioteca json de python.

El problema aquí es que el cliente de prueba de Django (que se extiende por DRF) es un "navegador ficticio" ( https://docs.djangoproject.com/en/1.9/topics/testing/tools/#the-test-client ) y no funciona Funciona exactamente como lo haría un marco en el navegador como Selenium. Por lo tanto, las llamadas HTTP son en realidad solo llamadas HTTP simuladas que se enfocan en probar su lógica y que enrutan / vistas / serializadores / etc correctos. Están siendo usados.