使用假用户在 Symfony 3.3 中进行功能测试
Functional test in Symfony 3.3 with fake user
我想测试我在 Symfony 3.3.2 中创建的应用程序。
我正在使用 FOSUserBundle 作为我的用户系统。
我在 setUp 中创建了一个新客户端
public function setUp() {
$this->client = static::createClient();
}
我写了一个简单的函数,应该通过 fos 服务创建假用户
private function logInAdmin() {
$fosLoginManager = $this->client->getContainer()->get('fos_user.security.login_manager');
$user = new User();
$user->setEnabled(true);
$user->addRole('ROLE_ADMIN');
$fosLoginManager->logInUser('main', $user);
}
实际上这是发生了,但只有当我在控制器中手动测试这段代码时才会发生。在这种情况下,我以我刚刚在代码中创建的用户身份登录。我有我的角色等。但是当 PHPUnit 运行 这段代码时,用户变成 null
.
为什么会这样?如何正确操作?
<?php
namespace AdminBundle\Security;
use Symfony\Bundle\FrameworkBundle\Client;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\BrowserKit\Cookie;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
class LoginTest extends WebTestCase
{
/**
* @var Client
*/
private $client = null;
protected function setUp()
{
$this->client = static::createClient();
}
private function logIn()
{
$session = $this->client->getContainer()->get('session');
// the firewall context defaults to the firewall name
$firewallContext = 'main';
$token = new UsernamePasswordToken('admin', null, $firewallContext, array('ROLE_ADMIN'));
$session->set('_security_'.$firewallContext, serialize($token));
$session->save();
$cookie = new Cookie($session->getName(), $session->getId());
$this->client->getCookieJar()->set($cookie);
}
public function testLoginToBackOffice()
{
$this->logIn();
$crawler = $this->client->request('GET', '/admin');
$response = $this->client->getResponse();
$this->assertSame(Response::HTTP_OK, $response->getStatusCode());
//200 means i am logged in else should be a redirection to the login path
}
}
我在测试中使用 sqlite3 作为数据库层,这是我在 config_test.yml
中输入的内容
doctrine:
dbal:
driver: pdo_sqlite
path: "%kernel.cache_dir%/db"
charset: UTF8
在 运行 功能测试之前,我用架构和一些固定装置构建了一个数据库。
php bin/console doctrine:database:drop --force --env=test
php bin/console doctrine:database:create --env=test
php bin/console doctrine:schema:create --env=test
php bin/console doctrine:fixtures:load --env=test -n
我在 fixture 中创建了一个管理员用户。
我刚刚做了这个,现在测试通过了。
我想测试我在 Symfony 3.3.2 中创建的应用程序。
我正在使用 FOSUserBundle 作为我的用户系统。
我在 setUp 中创建了一个新客户端
public function setUp() {
$this->client = static::createClient();
}
我写了一个简单的函数,应该通过 fos 服务创建假用户
private function logInAdmin() {
$fosLoginManager = $this->client->getContainer()->get('fos_user.security.login_manager');
$user = new User();
$user->setEnabled(true);
$user->addRole('ROLE_ADMIN');
$fosLoginManager->logInUser('main', $user);
}
实际上这是发生了,但只有当我在控制器中手动测试这段代码时才会发生。在这种情况下,我以我刚刚在代码中创建的用户身份登录。我有我的角色等。但是当 PHPUnit 运行 这段代码时,用户变成 null
.
为什么会这样?如何正确操作?
<?php
namespace AdminBundle\Security;
use Symfony\Bundle\FrameworkBundle\Client;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\BrowserKit\Cookie;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
class LoginTest extends WebTestCase
{
/**
* @var Client
*/
private $client = null;
protected function setUp()
{
$this->client = static::createClient();
}
private function logIn()
{
$session = $this->client->getContainer()->get('session');
// the firewall context defaults to the firewall name
$firewallContext = 'main';
$token = new UsernamePasswordToken('admin', null, $firewallContext, array('ROLE_ADMIN'));
$session->set('_security_'.$firewallContext, serialize($token));
$session->save();
$cookie = new Cookie($session->getName(), $session->getId());
$this->client->getCookieJar()->set($cookie);
}
public function testLoginToBackOffice()
{
$this->logIn();
$crawler = $this->client->request('GET', '/admin');
$response = $this->client->getResponse();
$this->assertSame(Response::HTTP_OK, $response->getStatusCode());
//200 means i am logged in else should be a redirection to the login path
}
}
我在测试中使用 sqlite3 作为数据库层,这是我在 config_test.yml
中输入的内容doctrine:
dbal:
driver: pdo_sqlite
path: "%kernel.cache_dir%/db"
charset: UTF8
在 运行 功能测试之前,我用架构和一些固定装置构建了一个数据库。
php bin/console doctrine:database:drop --force --env=test
php bin/console doctrine:database:create --env=test
php bin/console doctrine:schema:create --env=test
php bin/console doctrine:fixtures:load --env=test -n
我在 fixture 中创建了一个管理员用户。
我刚刚做了这个,现在测试通过了。