如何使Twig的{{app.user}}在测试中不为空?

问题描述 投票:1回答:1

我有一个Symfony测试用例,其中测试了对网站管理区域的身份验证。这是测试用例(确实非常简单):

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

    /* ... */ 

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

    private function logInAs(string $name = '[email protected]', 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);
    }

问题是我的代码失败,因为响应带有一个由Symfony发送的以下消息的500 HTTP状态代码:

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

我知道错误的根源是TWIG,显然,对于Twig变量UsernamePasswordToken来说,设置{{ app.user }}是不够的-它设置为null,因此在我调用时:

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

在我的模板中,发送了异常。我想做的是使测试通过无需更改TWIG模板。我只想修改测试用例中的代码。

php symfony twig
1个回答
0
投票

也许RememberMeToken可以帮助您。

private function logInAs(string $name = '[email protected]', 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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.