При тестировании приложения Django DRF, как я могу сделать пользователя в моих тестах суперпользователем?
В настоящее время у меня есть приложение Django Rest Framework, которое выполняет различную логику для суперпользователей, чем для обычных пользователей. Я написал свои тесты, используя rest_framework.test и pytest-django. В настоящее время мои тесты не работают из-за ошибки: TypeError: Cannot cast AnonymousUser to int. Are you trying to use it in place of User?. Так как у меня нет набора пользователей (мое приложение не разрешает неаутентифицированных пользователей), мой код пытается найти профиль пользователя, совершающего вызов, и терпит неудачу.
На данный момент я не хочу тестировать функциональность логики User. Есть ли способ установить пользователя по умолчанию в test_settings.py на суперпользователя, или установить суперпользователя в функции def setup(self, request) в начале каждого из моих тестовых классов?
Документация DRF, относящаяся к аутентификации в тестировании, кажется, направлена на тестирование самой аутентификации, а не на предположение аутентификации вокруг других тестов. Основываясь на этих документах, я думаю, что смогу что-нибудь придумать, но должен быть стандартный способ сделать то, что я пытаюсь.
Из того, что я прочитал, я могу использовать force_authenticate на определенном пользователе, но мне неясно, откуда берется этот пользователь. Нужно ли мне предварительно заполнить БД суперпользователем для тестирования, или есть способ (желательно) создать суперпользователя "на лету"?
Помощь будет очень признательна :)
Django создает (и затем удаляет) новую базу данных на лету каждый раз, когда вы запускаете тесты. Вам не нужно заполнять базу данных перед тестами, просто создавайте нового пользователя в коде тестов каждый раз, когда он вам нужен. Например:
from rest_framework.test import force_authenticate, APITestCase, APIRequestFactory
from rest_framework.authtoken.models import Token
class Test(APITestCase):
def setUp(self):
self.factory = APIRequestFactory()
# If the user must be a superuser use User.objects.create_superuser instead of create_user
self.user = User.objects.create_user(username='test', first_name='test', last_name='test', email='test@gmail.com', password='Test1234')
def test_example():
request = self.factory.get(path='example/') # You can obtain the request in another way
force_authenticate(request, self.user)
# If you need a token use this instead:
force_authenticate(request, self.user,
Token.objects.get_or_create(user=self.user))