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)