Как я могу сделать {{app.user}} Twig не нулевым внутри тестов? - PullRequest
1 голос
/ 29 февраля 2020

У меня есть Symfony тестовый пример, в котором я проверяю аутентификацию в административной области моего сайта. Вот тестовый пример (действительно очень простой):

    public function setUp()
    {
        $this->client = static::createClient();
    }

    /* ... */ 

    public function testAdminHomepageAllowsAdmins(): void
    {
        $this->logInAs('admin@website.com', ['ROLE_SUPER_ADMIN']);
        $this->client->request('GET', '/admin');
        self::assertResponseStatusCodeSame(Response::HTTP_OK);
    }

    private function logInAs(string $name = 'user@website.com', array $roles = ['ROLE_USER']): void
    {
        $session = self::$container->get('session');
        $firewall = 'main';

        $token = new UsernamePasswordToken($name, null, $firewall, $roles);

        $session->set('_security_'.$firewall, serialize($token));
        $session->save();

        $cookie = new Cookie($session->getName(), $session->getId());
        $this->client->getCookieJar()->set($cookie);
    }

Проблема заключается в том, что мой код не выполняется, поскольку в ответе содержится код состояния HTTP 500 со следующим сообщением, отправленным Symfony:

Impossible to access an attribute ("email") on a null variable. (500 Internal Server Error)

Я знаю, что источником ошибки является TWIG. Очевидно, что для переменной Twig недостаточно UsernamePasswordToken. {{ app.user }} - устанавливается в ноль, и поэтому, когда Я звоню:

<span class="navbar-text">
    Logged in as {{ app.user.email }} - <a href="{{ path('app_logout') }}">Log out</a>
</span>

В моем шаблоне отправлено исключение. То, что я хотел бы сделать, это сделать тестовый проход без изменения шаблона TWIG . Я только хочу изменить код, который есть в моем тестовом примере.

Обратите внимание, что он не работает даже с «функциональной» функцией входа в систему, например:

    private function logInAs(string $email, string $plainPassword): void
    {
        $csrfToken = $this->client->getContainer()->get('security.csrf.token_manager')->getToken('authenticate');
        $this->client->request('POST', '/login', [
            'email' => $email,
            'password' => $plainPassword,
            '_csrf_token' => $csrfToken
        ]);
        $this->client->followRedirect();
    }

1 Ответ

0 голосов
/ 02 марта 2020

Может быть, RememberMeToken поможет вам.

private function logInAs(string $name = 'user@website.com', array $roles = ['ROLE_USER']): void
    {
        $session = self::$container->get('session');
        $firewall = 'main';

        // Edit here according to your User entity
        $user = (new User)
            ->setRoles($roles)
            ->setName($name)
            ->setEmail($name);

        $token = new RememberMeToken($name, null, $firewall, $firewall);

        $session->set('_security_'.$firewall, serialize($token));
        $session->save();

        $cookie = new Cookie($session->getName(), $session->getId());
        $this->client->getCookieJar()->set($cookie);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...