2014-12-24 26 views
14

0 Djके लिए Django-oauth-toolkit का उपयोग करके Django-rest-framework के साथ एक एपीआई एंडपॉइंट का परीक्षण कैसे करें मेरे पास एक एपीआई एंडपॉइंट को परिभाषित करने के लिए एक Django-rest-framework Viewset/राउटर है। viewset इस तरह के रूप में परिभाषित किया जाता है:प्रमाणीकरण

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

और रूटर के रूप में

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

हो रही द्वारा कर्ल ठीक के माध्यम से/url पैटर्न के साथ परिभाषित किया गया है url(r'^api/', include(router.urls))

मैं ब्राउज़र में इस endpoint हिट कर सकते हैं सही पहुंच टोकन और प्राधिकरण के लिए इसका उपयोग कर रहा है। हालांकि, यह स्पष्ट नहीं है कि इस एंडपॉइंट के खिलाफ परीक्षण कैसे लिखें।

यहाँ मैं क्या कोशिश की है है:

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) 

यह client.get() कॉल से एक HTTP 401 प्रतिक्रिया के साथ विफल रहता है। Oauth2 प्रमाणीकरण के लिए django-oauth-toolkit का उपयोग करके डीआरएफ में एपीआई एंडपॉइंट का परीक्षण करने का सही तरीका क्या है?

उत्तर

23

जब आप परीक्षण लिख रहे हों, तो आपको परीक्षण से परीक्षण नहीं कर रहे किसी भी चीज़ को निकालने का लक्ष्य रखना चाहिए, आमतौर पर परीक्षण के setUp विधि में कोई सेटअप कोड डालना चाहिए। ओएथ के साथ एपीआई परीक्षणों के मामले में, इसमें आमतौर पर परीक्षण उपयोगकर्ता, ओएथ एप्लिकेशन और सक्रिय पहुंच टोकन शामिल होता है।

django-oauth-toolkit, और अन्य Django अनुप्रयोगों के लिए, मैं हमेशा looking at the tests to see how they do it की अनुशंसा करता हूं। यह आपको अनएडेड एपीआई कॉल बनाने से बचने की अनुमति देता है, खासकर ओएथ जैसे बहु-भाग प्रक्रियाओं के लिए, और केवल कुछ मॉडल ऑब्जेक्ट्स की आवश्यकता होती है जो आवश्यक हैं।

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) 
    ) 

वहां से आपको केवल उत्पन्न टोकन का उपयोग करके प्रमाणित करने की आवश्यकता है। आप इसे injecting the Authorization header द्वारा कर सकते हैं, या आप Django REST Framework द्वारा प्रदत्त use the force_authenticate method कर सकते हैं।

+1

यह टिकट है। मैं एक्सेस टोकन के निर्माण को याद कर रहा था + यह अनुरोध में टोकन को इंजेक्ट करने का तरीका स्पष्ट नहीं था। धन्यवाद! – Jim

+0

यह वही था जो मैं ढूंढ रहा था। आपका बहुत बहुत धन्यवाद! – DanXPrado

संबंधित मुद्दे