Как авторизовать пользователя в REST-фреймворке тестирования Django пост-методом APIClient

Может кто-нибудь помочь мне. Я не могу авторизовать своего тестового пользователя в 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)

Обнаружена ошибка

AssertionError: 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 Base test. Благодаря этому вы можете сосредоточиться на тестировании

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

Вернуться на верх