2017-11-30 8 views
1

인증을 위해 JWT 패키지와 함께 DRF를 사용하고 있습니다. 자, JWT 토큰으로 자체를 인증하는 단위 테스트를 작성하려고합니다. 아무리 시도해도 테스트 API 클라이언트가 JWT를 통해 자체 인증을받을 수 없습니다. API 클라이언트 (필자의 경우 Postman)와 동일한 작업을 수행하면 모든 것이 작동합니다. Django Rest Framework JWT 유닛 테스트

테스트 케이스이다 :

from django.urls import reverse 
from rest_framework.test import APITestCase 
from rest_framework_jwt.settings import api_settings 

from backend.factories import member_factory 

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER 
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER 


class MemberTests(APITestCase): 
    def test_get_member(self): 
     member = member_factory() 

     payload = jwt_payload_handler(member.user) 
     token = jwt_encode_handler(payload) 

     self.client.credentials(Authorization='JWT {0}'.format(token)) 
     response = self.client.get(reverse('member-detail', kwargs={'pk': member.pk})) 
     assert response.status_code == 200 

그러나 나는 항상 401 Authentication credentials were not provided를 얻을.

response.request 나는 토큰이 있다는 것을 알았습니다. 단지 적용되지 않았을 것입니다.

rest_framework.test.RequestsClient을 사용하도록 테스트를 다시 작성하고 실제로 live_server URL로 보내면 작동합니다.

어떤 도움이 필요합니까?

P. force_authenticate()login을 알고 있지만, 단위 테스트에서 API 클라이언트가 프로덕션 환경과 동일한 방식으로 API에 액세스하기를 바랍니다.

+0

두 분이 내 하루를 보냈습니다. 감사합니다 –

답변

2

이 테스트를 위해 새 APIClient를 설정하십시오. 이것은 내 자신의 테스트가 어떻게 보이는지입니다

def test_api_jwt(self): 

    url = reverse('api-jwt-auth') 
    u = user_model.objects.create_user(username='user', email='[email protected]', password='pass') 
    u.is_active = False 
    u.save() 

    resp = self.client.post(url, {'email':'[email protected]', 'password':'pass'}, format='json') 
    self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST) 

    u.is_active = True 
    u.save() 

    resp = self.client.post(url, {'username':'[email protected]', 'password':'pass'}, format='json') 
    self.assertEqual(resp.status_code, status.HTTP_200_OK) 
    self.assertTrue('token' in resp.data) 
    token = resp.data['token'] 
    #print(token) 

    verification_url = reverse('api-jwt-verify') 
    resp = self.client.post(verification_url, {'token': token}, format='json') 
    self.assertEqual(resp.status_code, status.HTTP_200_OK) 

    resp = self.client.post(verification_url, {'token': 'abc'}, format='json') 
    self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST) 

    client = APIClient() 
    client.credentials(HTTP_AUTHORIZATION='JWT ' + 'abc') 
    resp = client.get('/api/v1/account/', data={'format': 'json'}) 
    self.assertEqual(resp.status_code, status.HTTP_401_UNAUTHORIZED) 
    client.credentials(HTTP_AUTHORIZATION='JWT ' + token) 
    resp = client.get('/api/v1/account/', data={'format': 'json'}) 
    self.assertEqual(resp.status_code, status.HTTP_200_OK) 
+0

감사. 새로운 APIClient는 APITestCase가 이미 가지고 있기 때문에 필요하지 않습니다. 그러나 'HTTP_AUTHORIZATION'이 트릭을했습니다! – Chris