使用假用户在Symfony 3.3中进行功能测试

时间:2017-06-24 17:56:52

标签: php symfony phpunit fosuserbundle symfony-3.3

我想测试在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

为什么会这样?如何正确地做到这一点?

1 个答案:

答案 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

在灯具内部,我创建了一个管理员用户。

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