如何在 Django 测试 REST 框架 APIClient post 方法中授权用户

How to authorize user in Django testing REST framework APIClient post method

有人可以帮助我吗?我无法在 unittests

中授权我的测试用户
class APIGameTestCase(APITestCase):
    def setUp(self):
        self.user = User.objects.create_user(username='testuser', password='123')
        self.token = Token.objects.get(user=self.user)
        self.api_authentication()

    def api_authentication(self):
        self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token.key)

    def test_create_game(self):
        url = reverse('game-list')
        payload = {
            'name': 'testgame',
            'game_category': 'testgamecategory',
            'played': False,
            'release_date': '2016-06-21T03:02:00.776594Z',
        }
        response = self.client.post(url, payload)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

断言错误

断言错误:401 != 201

models.py

@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

有更好的方法来做到这一点。您可以使用 client.force_authenticate。这包含在 DRF 基础测试 class 中。因此,您可以专注于测试

class APIGameTestCase(APITestCase):
    def setUp(self):
        self.user = User.objects.create_user(username='testuser', password='123')
        self.client.force_authenticate(self.user)

    def test_create_game(self):
        url = reverse('game-list')
        payload = {
            'name': 'testgame',
            'game_category': 'testgamecategory',
            'played': False,
            'release_date': '2016-06-21T03:02:00.776594Z',
        }
        response = self.client.post(url, payload)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

您可以在此处阅读更多相关信息:https://www.django-rest-framework.org/api-guide/testing/#forcing-authentication