2012-05-02 9 views
4

私はfosUserBundleでサイトを設定しようとしています。私は単体テストを書く必要がありますが、私はそれらを使って正しく動作するように認証を得ることができません。私は運がないいくつかの方法を試しました。FOSUserBundleユニットテスト

私が頼りにすることができる標準的なログインを行うセキュリティ設定のアプローチ1チェーンプロバイダ。私はこれを行うと作品のみの認証は方法2 - 私は

 
security: 
    encoders: 
     "FOS\UserBundle\Model\UserInterface": plaintext 
     "Symfony\Component\Security\Core\User\User": plaintext 

    providers: 
     chain_provider: 
      providers: [in_memory, fos_userbundle] 
     in_memory: 
      users: 
       admin: { password: admin, roles: [ 'ROLE_ADMIN' ] } 
     fos_userbundle: 
      id: fos_user.user_manager 


    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       login_path:/
       csrf_provider: form.csrf_provider 
       default_target_path: /media 
      logout:  true 
      anonymous: true 
      http_basic: 
       provider: in_memory 

のsecurity.yml fosUserBundle

によって作成されたユーザを管理者ユーザでログインすることはできませんが、意味in_memoryプロバイダである私は、ユーザーが作成しました私のユニットテストのセットアップで。しかし、この方法では、作成したユーザーでログインすることはできません。ユーザーの確認は必要ありません。

 
public function setUp() { 

     $kernel = static::createKernel(); 
     $this->repo = $kernel->boot(); 
     $this->repo = $kernel->getContainer(); 

     $userManager = $this->repo->get('fos_user.user_manager'); 

     $email = "testing".(string) self::newRandomNumber()."@test.com"; 
     $un = "test".(string) self::newRandomNumber(); 
     $fn = "testin"; 
     $ln = "laster"; 
     $pwd = "passworD1"; 

     $user = $userManager->createUser(); 

     $user->setEmail($email); 
     $user->setUsername($un); 
     $user->setFirstName($fn); 
     $user->setLastName($ln); 
     $user->setPlainPassword($pwd); 
     $user->setBimStaff(True); 

     // Persist the user to the database   
     $userManager->updateUser($user); 

     $this->user = $user; 

     $this->client = static::createClient(); 
     $crawler = $this->client->request('GET', '/'); 

     $form = $crawler->selectButton('Login')->form(); 

     // set some values 
     $un = 'Lucas'.self::newRandomNumber(); 
     $form['_username'] = $un; 
     $form['_password'] = $pwd; 

     // submit the form 

     $crawler = $this->client->submit($form); 
     print_r($this->client->getResponse()); 

     $this->client->followRedirects(); 

    } 

フォームとhttp基本認証の両方でログインしようとしましたが、いずれも動作していないようです。

いずれかのアドバイスをお持ちですか?

おかげで、 コーリー

+0

です:あなたがフルに関わる機能をテストしているとして、それは、機能テストですユニットテストは、他のクラスから分離された1つのクラスをテストすることです。 –

答えて

4

うーん、あなたがセキュリティでプロバイダを連鎖さあなたは私のために問題を解決している、少なくとも、ひとつのプロバイダを使用することはできませんようです。私はchain_providerに両方のプロバイダを変更するとすぐに、何らかの理由で

// security.yml 
providers: 
    chain_provider: 
     providers: [in_memory, fos_userbundle] 
    in_memory: 
     users: 
      admin: { password: admin, roles: [ 'ROLE_ADMIN' ] } 
    fos_userbundle: 
     id: fos_user.user_manager 


firewalls: 
    main: 
     pattern: ^/ 
     form_login: 
      provider: chain_provider 
      login_path:/
      csrf_provider: form.csrf_provider 
      default_target_path: /media 
     logout:  true 
     anonymous: true 
     http_basic: 
      provider: chain_provider 

は、それが協力し始めました。

これをコピーした場合は私のユニットテストは、今私はあなたのユーザーのための強力なパスワードを使用することをお勧めしこの

public function setUp() { 

    $kernel = static::createKernel(); 
    $this->repo = $kernel->boot(); 
    $this->repo = $kernel->getContainer(); 


    $this->client = static::createClient(array(), array(
     'PHP_AUTH_USER' => 'admin', 
     'PHP_AUTH_PW' => 'admin', 
    )); 
    $this->client->followRedirects(); 

} 

のように見えます:)

1

私は同じ問題を抱えていたが、私はオプション2を望んでいました働くあなたの例はで、ほとんどであり、助けてくれました。私はそれがあなたのために働いていなかった理由は、ユーザーが有効になっていないということです。あなたは$user->setEnable(true)

を呼び出す必要がありますので、FOSUserBundleでユーザーコンストラクタは、デフォルトでは無効なユーザーが作成されますここに私の作業の例では、サイドノートに

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 
use Symfony\Component\BrowserKit\Cookie; 
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; 

class MyControllerTest extends WebTestCase 
{ 
    private $client = null; 

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

    private function logIn() 
    { 
     $session = $this->client->getContainer()->get('session'); 

     $userManager = $this->client->getContainer()->get('fos_user.user_manager'); 

     $user=$userManager->findUserByUsername('tester'); 
     if (!$user) { 
      $user = $userManager->createUser(); 

      $user->setEmail('[email protected]'); 
      $user->setUsername('tester'); 
      $user->setPlainPassword('foo'); 
      $user->setEnabled(true); 
      $user->addRole('ROLE_SUPER_ADMIN'); 

      $userManager->updateUser($user); 
     } 

     $firewall = 'main_firewall'; 
     $token = new UsernamePasswordToken($user, null, $firewall, array('ROLE_SUPER_ADMIN')); 

     $session->set('_security_'.$firewall, serialize($token)); 
     $session->save(); 

     $cookie = new Cookie($session->getName(), $session->getId()); 
     $this->client->getCookieJar()->set($cookie); 
    } 

    public function testCompleteScenario() 
    { 
     $this->logIn(); 

     $crawler = $this->client->request('GET', '/foo/'); 
     $this->assertEquals(200, $this->client->getResponse()->getStatusCode(), 
      "Unexpected HTTP status code for GET /foo/".$this->client->getResponse()->getContent()); 

    } 

} 
+0

[DoctrineFixturesBundle](http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html)(および[LiipFunctionalTestBundle](https://github.com/liip/LiipFunctionalTestBundle))を使用することをお勧めします。テスト中にデータベースにデータをロードする。テスト関数にエンティティを定義する必要はありません。 –