Метод force_login
Метод force_login применяется к объекту класса Client и позволяет принудительно установить текущего пользователя для тестового клиента. В отличие от метода login, который выполняет реальный процесс аутентификации через форму входа, force_login напрямую устанавливает пользователя в сессию клиента, что значительно ускоряет тестирование. Метод принимает объект пользователя и необязательный бэкенд аутентификации.
Синтаксис
client.force_login(user, backend=None)
Пример
Давайте принудительно аутентифицируем обычного пользователя и проверим доступ к защищенной странице:
from django.test import TestCase, Client
from django.contrib.auth.models import User
from django.urls import reverse
class ProfileViewTest(TestCase):
def setUp(self):
self.client = Client()
self.user = User.objects.create_user(
username="testuser",
password="testpassword"
)
def test_profile_page_with_force_login(self):
self.client.force_login(self.user)
response = self.client.get(reverse("profile"))
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Welcome, testuser")
Результат выполнения кода:
"Test passed successfully"
Пример
Давайте принудительно аутентифицируем суперпользователя и проверим доступ к админке:
from django.test import TestCase, Client
from django.contrib.auth.models import User
from django.urls import reverse
class AdminViewTest(TestCase):
def setUp(self):
self.client = Client()
self.admin_user = User.objects.create_superuser(
username="admin",
email="admin@example.com",
password="adminpassword"
)
def test_admin_access_with_force_login(self):
self.client.force_login(self.admin_user)
response = self.client.get(reverse("admin:index"))
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Django administration")
Результат выполнения кода:
"Test passed successfully"
Пример
Давайте сравним force_login и login методы на примере:
from django.test import TestCase, Client
from django.contrib.auth.models import User
from django.urls import reverse
class LoginComparisonTest(TestCase):
def setUp(self):
self.client = Client()
self.user = User.objects.create_user(
username="testuser",
password="testpassword"
)
def test_force_login_vs_login(self):
# force_login - прямой доступ без проверки пароля
self.client.force_login(self.user)
response1 = self.client.get(reverse("dashboard"))
self.assertEqual(response1.status_code, 200)
# login - требует правильного пароля
self.client.logout()
success = self.client.login(
username="testuser",
password="testpassword"
)
self.assertTrue(success)
response2 = self.client.get(reverse("dashboard"))
self.assertEqual(response2.status_code, 200)
Результат выполнения кода:
"Both login methods worked successfully"
Смотрите также
-
метод
login,
который выполняет реальный вход пользователя через форму аутентификации -
метод
logout,
который выполняет выход текущего пользователя из системы -
класс
TestCase,
который предоставляет тестовую среду с клиентом и фикстурами -
атрибут
session,
который предоставляет доступ к сессии тестового клиента