2017-06-24 9 views
1

私はSymfony 3.3.2で作成したアプリケーションをテストしたいと思っています。
私はユーザシステムとしてFOSUserBundleを使用しています。偽のユーザとSymfony 3.3の機能テスト

私は

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); 
} 

は実はこれが起こっているが、私は手動でこのコードをテストする場合にのみFOSサービスによって偽のユーザーを作成する必要があります簡単な関数を書いたのsetUp

public function setUp() { 
    $this->client = static::createClient(); 
} 

で新しいクライアントを作成しますコントローラ内。この場合、私はコードで作成したユーザーとしてログに記録されます。私は自分の役割などを持っていますが、PHPUnitがこのコードを実行すると、ユーザはnullになります。

これはなぜ発生していますか?どのように正しく行うには?私は、データベース層として、私のテストのsqlite3のために使用

答えて

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 
    } 


} 

、ここに私は私のconfig_test.ymlに

doctrine: 
    dbal: 
    driver: pdo_sqlite 
    path:  "%kernel.cache_dir%/db" 
    charset: UTF8 

を置くものですそしてfunctionnalsテストを実行する前に、私は、スキーマとデシベルといくつかの備品を構築。

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 

私は管理者を作成します。

これでテストがパスされました。

+0

私はしましたが、それは私のためには機能しません。それは私が尋ねている理由です – Night

+0

私は私の答えを編集しました、これはあなたを助けることを願って – jeremy

+0

それは今、感謝!私は今、頭の中でとても混乱している。私はまったく同じコードを試したと確信して、それは動作しませんでしたので、私はFOSを試し始めました; – Night

関連する問題