我有一个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模板。我只想修改测试用例中的代码。
也许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);
}