Новое в Symfony 5.1: Упрощенная авторизация в тестах

В функциональных тестах тестирование защищенных страниц требует входа в систему как пользователь. Воспроизведение фактического процесса входа в систему (например, ввод имени пользователя и пароля в форме входа в систему и его отправка) замедляет тестирование. Symfony рекомендует этот трюк в качестве более быстрой альтернативы, но он может не соответствовать вашим потребностям.

Вот почему в Symfony 5.1 добавили новый метод loginUser() для имитации полной авторизации пользователя в тестах. Передайте объект UserInterface пользователя, которому вы хотите войти, и это все:

// tests/Controller/ProfileControllerTest.php
namespace App\Tests\Controller;

use App\Repository\UserRepository;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class ProfileControllerTest extends WebTestCase
{
    // ...

    public function testVisitingWhileLoggedIn()
    {
        $client = static::createClient();

        // get or create the user somehow (e.g. creating some users only
        // for tests while loading the test fixtures)
        $userRepository = static::$container->get(UserRepository::class);
        $testUser = $userRepository->findOneByEmail('jane.doe@example.com');

        $client->loginUser($testUser);

        // user is now logged in, so you can test protected resources
        $client->request('GET', '/profile');
        $this->assertResponseIsSuccessful();
        $this->assertSelectorTextContains('h1', 'Hello Username!');
    }
}