2013-12-16 5 views
5

Quindi ho i modelli Actor e Role e un'API REST predefinita che utilizza Viewsets e HyperlinkedModelSerializer.Django REST Framework: come utilizzare correttamente il campo url HyperlinkedModelSerializer nei test unitari

Il mio obiettivo: un test unitario che crea un ruolo con un attore associato.

mio codice di prova è attualmente:

def test_post_create_role_for_actor(self): 

    # default actor 
    actor = ActorFactory() 

    # inherits HyperlinkedModelSerializer 
    actor_serialized = ActorSerializer(actor) 

    postdata = { 
     'role': 'mydummyrole', 
     'actor': actor_serialized.data['url'] 
    } 

    ret = self.client.post(self.url, json.dumps(postdata), content_type='application/json') 

    self.assertEqual(ret.status_code, 201) 
    self.assertTrue(Role.objects.filter(role='mydummyrole', actor_id=actor.id).exists()) 

Ora, questo sembra molto brutto per me, soprattutto la serializzazione per recuperare il campo URL generato. In realtà, ho ricevuto un avviso di disapprovazione:

DeprecationWarning: Usando HyperlinkedIdentityField senza includere la richiesta nel contesto serializzatore è deprecato. Aggiungi context={'request': request} durante l'istanziazione del serializzatore.

Ma il campo "url" generato dal serializzatore sembra non correlato a nessuna richiesta. Qual è il modo corretto per recuperare questo campo? Sento che mi manca un concetto qui. O due.

TIA!

+3

È necessario passare la richiesta in modo che l'URL possa essere convertito in assoluto. Vedi Vedi http://django-rest-framework.org/api-guide/reverse –

risposta

5

In preparazione dello test di unità, desidero innanzitutto inserire l'attore:

actor = ActorFactory() 
actor.save() 

quindi utilizzare il metodo di Django reverse per ottenere l'url usando id dell'attore, o qualunque campo si utilizza come identificativo nel URL :

Come invertire l'URL dipende da come è stata impostata la risorsa, ma dovrebbe essere possibile.

+2

L'idea è che l'URL serializzato non dovrebbe dipendere dalla richiesta che lo ha generato. Pertanto, il resto del framework utilizza la richiesta per rendere gli URL assoluti e non relativi. –