如何在Django REST Framework中进行单元测试期间登录用户?

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从我的观点中得到回应。我已经在测试中登录了用户。我究竟做错了什么?

Bab*_*yan 5

由于您使用的是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)