2014-12-24 9 views
14

Ho un viewet/router Django-rest-framework per definire un endpoint API. Il viewset è definito come tale:Come testare un endpoint API con Django-rest-framework utilizzando Django-oauth-toolkit per l'autenticazione

class DocumentViewSet(viewsets.ModelViewSet): 
    permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope] 
    model = Document 

E il router è definito come

router = DefaultRouter() 
router.register(r'documents', viewsets.DocumentViewSet) 

con il modello URL url(r'^api/', include(router.urls))

posso colpire questo endpoint nel browser/attraverso ricciolo bene ottenendo il token di accesso corretto e utilizzarlo per l'autorizzazione. Tuttavia, non è chiaro come scrivere test contro questo endpoint.

Ecco che cosa ho provato:

class DocumentAPITests(APITestCase): 
    def test_get_all_documents(self): 
     user = User.objects.create_user('test', '[email protected]', 'test') 
     client = APIClient() 
     client.credentials(username="test", password="test") 
     response = client.get("/api/documents/") 
     self.assertEqual(response.status_code, 200) 

Questo non riesce con un 401 risposta HTTP dalla chiamata client.get(). Qual è il modo giusto per testare un endpoint API in DRF usando django-oauth-toolkit per l'autenticazione oauth2?

risposta

23

Durante la scrittura di test, è necessario cercare di estrarre tutto ciò che non si sta testando dal test stesso, in genere inserendo qualsiasi codice di configurazione nel metodo setUp del test. Nel caso di test API con OAuth, in genere questo include l'utente di test, l'applicazione OAuth e il token di accesso attivo.

Per django-oauth-toolkit e altre applicazioni Django, consigliamo sempre looking at the tests to see how they do it. Ciò consente di evitare di effettuare chiamate API non necessarie, soprattutto per processi multiparte come OAuth, e di creare solo i pochi oggetti modello richiesti.

Da lì è sufficiente autenticarsi utilizzando il token che è stato generato. È possibile farlo da injecting the Authorization header, oppure è possibile use the force_authenticate method fornito da Django REST Framework.

+1

Questo è il biglietto. Mi mancava la creazione del token di accesso + non era chiaro come iniettare il token nella richiesta. Grazie! – Jim

+0

Questo era esattamente quello che stavo cercando. Grazie mille! – DanXPrado