使用假用户在 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 中创建了一个管理员用户。

我刚刚做了这个,现在测试通过了。