如何在 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 用户密码?