Метод loginUser
Метод loginUser класса WebTestCase
выполняет аутентификацию пользователя
непосредственно в тесте. Первым параметром
передаётся объект пользователя (обычно
сущность User), а вторым - имя
брандмауэра из конфигурации безопасности.
После вызова метода клиент считается
вошедшим, и все последующие запросы
выполняются от имени этого пользователя.
Метод не создаёт сессию через форму входа, а подставляет пользователя напрямую в токен-хранилище. Это ускоряет тесты и убирает зависимость от страницы логина.
Синтаксис
loginUser(UserInterface $user, string $firewallContext = 'main'): void
Пример
Давайте создадим тест, в котором пользователь входит и получает доступ к защищённой странице:
<?php
namespace AppTestsController;
use AppEntityUser;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleTestWebTestCase;
class ArticleControllerTest extends WebTestCase
{
public function testProtectedPage(): void
{
$client = static::createClient();
$em = static::getContainer()->get(EntityManagerInterface::class);
$user = new User();
$user->setEmail('user@example.com');
$user->setPassword('hashed_password');
$user->setRoles(['ROLE_USER']);
$em->persist($user);
$em->flush();
$client->loginUser($user);
$client->request('GET', '/article');
$this->assertResponseIsSuccessful();
$this->assertSelectorTextContains('h1', 'Articles');
}
}
?>
Результат выполнения теста:
"OK (1 test, 3 assertions)"
Пример
Давайте укажем нестандартный брандмауэр
'admin' вторым параметром:
<?php
namespace AppTestsController;
use AppEntityUser;
use SymfonyBundleFrameworkBundleTestWebTestCase;
class AdminControllerTest extends WebTestCase
{
public function testAdminPage(): void
{
$client = static::createClient();
$admin = new User();
$admin->setEmail('admin@example.com');
$admin->setPassword('hashed_password');
$admin->setRoles(['ROLE_ADMIN']);
$client->loginUser($admin, 'admin');
$client->request('GET', '/admin');
$this->assertResponseIsSuccessful();
}
}
?>
Результат выполнения теста:
"OK (1 test, 2 assertions)"
Смотрите также
-
класс
WebTestCase,
который является базой для функциональных тестов -
метод
createClient,
который создаёт клиент для запросов в тестах -
метод
request,
который выполняет HTTP-запрос к приложению -
метод
assertResponseIsSuccessful,
который проверяет успешный ответ сервера