So testen Sie eine API-Endpunkt, Django-rest-framework mit Django-oauth-toolkit für die Authentifizierung
Habe ich ein Django-rest-framework viewset/router definieren eine API-Endpunkt. Die viewset ist so definiert:
class DocumentViewSet(viewsets.ModelViewSet):
permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
model = Document
Und der router ist definiert als
router = DefaultRouter()
router.register(r'documents', viewsets.DocumentViewSet)
mit url-Muster url(r'^api/', include(router.urls))
Kann ich Treffer dieser Endpunkt im browser/über curl Prima immer die richtigen access token und Sie für die Autorisierung. Es ist jedoch nicht klar, wie schreiben von tests für diesen Endpunkt.
Hier ist, was ich versucht habe:
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)
Dieser schlägt mit einer HTTP-401-Antwort vom client.get()
nennen. Was ist der richtige Weg, um zu testen, eine API-Endpunkt in DRF mit django-oauth-toolkit für oauth2-Authentifizierung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim schreiben von tests, sollten Sie versuchen zu extrahieren, was Sie nicht Test aus der test selbst, in der Regel setzen alle setup-code in der
setUp
Methode der Prüfung. Im Fall von API-tests mit OAuth, dies umfasst in der Regel die test-user, OAuth-Anwendung und der active access token.Für
django-oauth-toolkit
und andere Django-Anwendungen, würde ich immer empfehlen Blick auf die tests, um zu sehen, wie Sie es tun. Dies können Sie vermeiden, dass unnötige API-Aufrufe, vor allem für die multi-part-Verfahren wie OAuth, und erstellen Sie nur die paar model-Objekte, die benötigt werden.Von dort aus müssen Sie nur die Authentifizierung unter Verwendung des token, das generiert wurde. Sie können dies tun, indem die Injektion der
Authorization
- header, oder Sie können verwenden Sie dieforce_authenticate
Methode zur Verfügung gestellt von Django REST Framework.Habe ich die gleiche Bibliothek für OAuth2,
Dieser arbeitete für mich
Nun alles funktioniert wie erwartet.
Hoffe, das hilft. Dank