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

Posted

技术标签:

【中文标题】如何在 Django REST Framework 中的单元测试期间登录用户?【英文标题】:How to login a user during a unit test in Django REST Framework? 【发布时间】:2018-04-21 10:32:51 【问题描述】:

这是我的 DRF 视图:

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def check_user(request):
    user = request.user
    # use user object here
    return JSONResponse()

这是我对所述视图的单元测试:

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)

但我总是收到401 UNAUTHORIZED 的回复。我已经在我的测试中登录了用户。我做错了什么?

【问题讨论】:

【参考方案1】:

由于您使用的是 Django REST 框架,因此您还必须使用名为 APIClient 的 DRF 测试客户端,而不是 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)

另一种方法是使用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)

【讨论】:

以上是关于如何在 Django REST Framework 中的单元测试期间登录用户?的主要内容,如果未能解决你的问题,请参考以下文章

Django.rest_framework:如何序列化一对多?

如何使用 TemplateHTMLRenderer 在 Django-REST-Framework 中创建/放置?

django-rest-framework:如何序列化已经包含 JSON 的字段?

如何在 Django Rest Framework 中散列 Django 用户密码?

如何仅使用 django 作为后端并使用 django-rest-framework 发布

如何在 React 中显示来自 django-rest-framework 的错误消息