我将JRF包与DRF一起使用进行身份验证。现在,我正在尝试编写一个使用JWT令牌进行身份验证的单元测试。无论如何尝试,我都无法使测试API客户端通过JWT对其进行身份验证。如果我对API客户端(在我的情况下为Postman)执行相同操作,则一切正常。
这是测试用例:
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,则它可以工作。
有什么帮助吗?
PS,我知道force_authenticate()
并登录,但是我希望我的单元测试可以像访问API客户端一样访问API。
尝试为此测试设置一个新的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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句