Bab*_*yan 3 authentication django unit-testing django-authentication django-rest-framework
这是我的DRF视图:
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def check_user(request):
user = request.user
# use user object here
return JSONResponse({})
Run Code Online (Sandbox Code Playgroud)
这是我对上述观点的单元测试:
class CheckUserViewTest(TestCase):
def test_check_user(self):
user = User.objects.create_user('username', 'Pas$w0rd')
self.client.login(username='username', password='Pas$w0rd')
response = self.client.get(reverse('check_user'))
self.assertEqual(response.status_code, httplib.OK)
Run Code Online (Sandbox Code Playgroud)
但是我总是401 UNAUTHORIZED从我的观点中得到回应。我已经在测试中登录了用户。我究竟做错了什么?
由于您使用的是Django REST Framework,因此还必须使用DRF的测试客户端(APIClient而不是Django的测试客户端)。如果您继承自DRF APITestCase而不是Django,则会自动发生这种情况TestCase。
完整的例子:
class CheckUserViewTest(APITestCase):
def test_check_user(self):
user = User.objects.create_user('username', 'Pas$w0rd')
self.assertTrue(self.client.login(username='username', password='Pas$w0rd'))
response = self.client.get(reverse('check_user'))
self.assertEqual(response.status_code, httplib.OK)
Run Code Online (Sandbox Code Playgroud)
一种替代方法是使用force_authenticate:
class CheckUserViewTest(APITestCase):
def test_check_user(self):
user = User.objects.create_user('username', 'Pas$w0rd')
self.client.force_authenticate(user)
response = self.client.get(reverse('check_user'))
self.assertEqual(response.status_code, httplib.OK)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2230 次 |
| 最近记录: |