Django тестирование как сделать запрос как вошедший пользователь?

В тестах Django я хочу войти в систему и сделать запрос. Вот код

    def test_something(self):
        
        self.client.login(email=EMAIL, password=PASSWORD)
        response = self.client.get(reverse_lazy("my_releases"))
        self.assertEqual(response, 200)

Но код не работает и возвращает

AttributeError: 'AnonymousUser' object has no attribute 'profile'

Как сделать запрос в тесте от имени вошедшего пользователя?

Как говорится в документации по .login(…):

(...)

login() возвращает True, если учетные данные были приняты и вход в систему был успешным.

Наконец, вам нужно не забыть создать учетные записи пользователей перед тем, как вы можете использовать этот метод.

Тесты нормально работают на отдельной базе данных, и поэтому элементы, созданные во время отладки или в производстве, не влияют на это.

Вы сначала создаете пользователя, а затем тестируете его с помощью:

from django.contrib.auth import get_user_model

# …

    def test_something(self):
        User = get_user_model()
        User.objects.create_user('my-user-name', email=EMAIL, password=PASSWORD)
        self.assertTrue(self.client.login(email=EMAIL, password=PASSWORD))
        response = self.client.get(reverse_lazy("my_releases"))
        self.assertEqual(response, 200)

Стандартный механизм аутентификации работает с именем пользователя и паролем, а не с электронной почтой и паролем, поэтому если вы использовали встроенный менеджер аутентификации, вы входите в систему с:

from django.contrib.auth import get_user_model

# …

    def test_something(self):
        User = get_user_model()
        User.objects.create_user('my-user-name', email=EMAIL, password=PASSWORD)
        self.assertTrue(self.client.login(username='my-user-name', password=PASSWORD))
        response = self.client.get(reverse_lazy("my_releases"))
        self.assertEqual(response, 200)
Вернуться на верх