我想测试在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
。
为什么会这样?如何正确地做到这一点?
答案 0 :(得分:1)
<?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
在运行functionnals测试之前,我使用架构和一些装置构建了一个db。
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
在灯具内部,我创建了一个管理员用户。
我刚刚做了这个,测试通过了。