2014-12-24 8 views
14

Bir API son noktasını tanımlamak için bir Django-rest-framework viewset/yönlendiricim var. viewset gibi tanımlanır:Kimlik doğrulaması için Django-oauth-toolkit kullanılarak bir Django-rest-framework ile bir API bitiş noktası nasıl test edilir

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

Ve url(r'^api/', include(router.urls))

ben tarayıcıda bu son nokta vurabilir yönlendirici alarak kıvrılma gayet güzel aracılığıyla/url desenli

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

olarak tanımlanır Doğru erişim belirteci ve yetkilendirme için kullanma. Ancak, bu son noktaya karşı nasıl test yazılacağı açık değildir. İşte

denedim budur:

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) 

Bu client.get() çağrısından HTTP 401 yanıtı ile başarısız olur. Oauth2 kimlik doğrulaması için django-oauth-toolkit kullanılarak DRF'de bir API son noktasını test etmenin doğru yolu nedir?

cevap

23

Testler yazarken, sınamadan sınamadığınız hiçbir şeyi ayıklamamalısınız, genellikle sınama için setUp yönteminde herhangi bir kurulum kodu koymalısınız. OAuth ile API testleri durumunda, bu genellikle test kullanıcısı, OAuth uygulaması ve aktif erişim belirtecini içerir.

django-oauth-toolkit ve diğer Django uygulamaları için her zaman looking at the tests to see how they do it'u öneririm. Bu, özellikle OAuth gibi çok parçalı işlemler için gereksiz API çağrıları yapmanıza ve yalnızca gerekli olan birkaç model nesneyi oluşturmanıza izin vermez.

def setUp(self): 
    self.test_user = UserModel.objects.create_user("test_user", "[email protected]", "123456") 

    self.application = Application(
     name="Test Application", 
     redirect_uris="http://localhost", 
     user=self.test_user, 
     client_type=Application.CLIENT_CONFIDENTIAL, 
     authorization_grant_type=Application.GRANT_AUTHORIZATION_CODE, 
    ) 
    self.application.save() 

def test_revoke_access_token(self): 
    from datetime import datetime 
    from django.utils import timezone 

    tok = AccessToken.objects.create(
     user=self.test_user, token='1234567890', 
     application=self.application, scope='read write', 
     expires=timezone.now() + datetime.timedelta(days=1) 
    ) 

Buradan, yalnızca oluşturulmuş belirteci kullanarak kimlik doğrulaması yapmanız gerekir. Bunu injecting the Authorization header ile yapabilir veya Django REST Framework tarafından sağlanan use the force_authenticate method yapabilirsiniz.

+1

Bu bilet. Erişim belirtecinin oluşturulmasını kaçırıyordum + belirtecin istek üzerine nasıl enjekte edileceği belli değildi. Teşekkürler! – Jim

+0

Tam olarak aradığım şey buydu. Çok teşekkür ederim! – DanXPrado

İlgili konular