2015-02-25 11 views
11

Sto provando a implementare i test per il Django Rest Framework. La maggior parte dei miei test è passata e la loro impostazione è andata a buon fine, ma ora sto riscontrando un problema in cui uno assertEqual non ha mai successo perché continua a confrontare JSON con OrderedDict.Test DRF: al posto di JSON viene restituito OrderedDict

Non ho idea da dove derivi OrderedDip dal momento che il DR dovrebbe restituire JSON (giusto?) Solo per.

Potrebbe essere possibile che l'ambiente di test analizzi il JSON prima del confronto? Questo farebbe schifo.

Sto facendo un test integrato che verifica solo i dati nella risposta di una richiesta GET a una determinata risorsa, lo faccio in base alle apparecchiature JSON. Non sto testando un componente specifico del framework REST poiché le mie implementazioni dei componenti sono così semplici che sono già state testate dai test nel progetto DRF.

In ogni caso, spero che qualcuno possa aiutarmi!

+1

Dovrai essere più specifico. Un serializzatore è responsabile della conversione dei dati in un dizionario ed è il renderer che lo trasforma in JSON. Quale bit stai testando esattamente? –

+1

Lo ha modificato! Ho già risolto il mio problema, ho avuto un problema nei miei dispositivi.Ma sono curioso di sapere perché confronta un OrderedDict con JSON e non con JSON con JSON quindi rispondi se hai tempo :) – ZvL

+1

Se hai bisogno di assicurarti l'ordine delle chiavi nella tua risposta JSON, allora puoi usare OrderedDict per componi la tua risposta. Non appena attraversa la porta e esce allo scoperto, diventa un semplice JSON, con le chiavi in ​​un ordine specifico. Poiché stai utilizzando l'infrastruttura di test di Django, la tua risposta non passa attraverso la porta, ma viene restituita alla tua testcase per essere ispezionata da te. Tale comportamento rende possibile testare un dict (JSON) rispetto a OrderedDict. Normalmente questo non dovrebbe essere un problema: basta asserire sulle singole chiavi. – Roba

risposta

1

Se i test sono qualcosa del tipo:

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

Poi la risposta sarà certamente un OrderedDict piuttosto che un documento JSON. Fortunatamente Django 1.9 ha introdotto il metodo response.json() (https://docs.djangoproject.com/en/1.9/topics/testing/tools/#django.test.Response.json) in modo da poter convertire facilmente la risposta in JSON. Si noti che è anche possibile utilizzare la libreria json di python.

Il problema è che il client di test di Django (che DRF estende) è un "dummy browser" (https://docs.djangoproject.com/en/1.9/topics/testing/tools/#the-test-client) e non funziona esattamente come un framework del browser come Selenium. Pertanto, le chiamate HTTP sono in realtà solo chiamate HTTP simulate che si concentrano sulla verifica della logica e su routing corretto/viste/serializzatori/ecc. sono in uso

0

È possibile scaricare i dati in JSON form--

import json 

ritorno HttpResponse (json.dumps (dati))

+1

grazie, questa è la risposta corretta per django <1.9 – awwester

+0

@awwester se trovi la mia risposta utile. gentilmente supportato da upvoting. Grazie –

3

Come spiegato here, questo è perché il formato di default per le richieste durante i test è multipart anziché json. È possibile specificare il formato, fornendo al vostro chiamata API in questo modo:

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

Oppure si può impostare il formato di richiesta di test di default nel vostro settings.py in questo modo:

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

Per risolvere il problema per tutto il vostro prova automagicamente.

Problemi correlati