2012-10-10 9 views
5

phpunitのエンティティマネージャに問題があります。エンティティマネージャとsymfony 2のphpunitに関する問題

これは私のテストです:

public function testValidChangeEmail() 
{ 
    $client = self::createAuthClient('user','password'); 

    $crawler = $client->request('GET', '/user/edit/30'); 
    $crawler = $client->submit($crawler->selectButton('submit')->form(array(
     'form[email]' => '[email protected]', 
    ))); 

    /* 
    * With this em, this work perfectly 
    * $em = $client->getContainer()->get('doctrine.orm.entity_manager'); 
    */ 

    $user = self::$em->getRepository('MyBundle:User')->findUser('[email protected]'); 

    die(var_dump($user->getEmail())); 
} 

、これはオリジナルのWebTestCaseを拡張し、私のWebTestCaseです:

class WebTestCase extends BaseWebTestCase 
{ 
    static protected $container; 
    static protected $em; 

    static protected function createClient(array $options = array(), array $server = array()) 
    { 
     $client = parent::createClient($options, $server); 
     self::$em = $client->getContainer()->get('doctrine.orm.entity_manager'); 
     self::$container = $client->getContainer(); 

     return $client; 
    } 

    protected function createAuthClient($user, $pass) 
    { 
     return self::createClient(array(), array(
      'PHP_AUTH_USER' => $user, 
      'PHP_AUTH_PW' => $pass, 
     )); 
    } 

あなたが見ることができるように私は私を作成したとき、私は自己:: $ EMを交換しますクライアント。

私の問題:私のテストで

die()は私のテストで登録されている古いメールではなく、新たな電子メール([email protected])を得ました。しかし私のデータベースでは、[email protected]が正しく保存されています。

データベースでユーザーを取得すると、私はsefl::$emを使用します。コメントに$emを使用すると、正しい新しいメールが取得されます。

私のWebTestCaseで、私は新しいエンティティマネージャにアクセスすることができますなぜ私は理解していない...

+0

サイドノートでは:地球上であなたが死ぬのはなぜ(のvar_dump())、有益な何かを返すのvar_dump行いませんどちらも、またあなたは、テストの途中で()死ぬ必要があるはずです。 – conny

答えて

4

あなたは、各要求の前にsymfonyのクライアントクラスのシャットダウンのカーネルため、新しいエンティティマネージャにアクセスすることはできませんサービスコンテナ全体を消去し、最初から再度構築することを意味します。

したがって、SECONDリクエストの後、あなた自身のWebTestCaseクラスにあるエンティティマネージャとは非常に異なるエンティティマネージャが得られます。 (私はクライアントシャットダウンのカーネルが何らかの要求が既に実行されている場合にのみ2番目の後に言った)

質問は本当にあなたのWebTestCaseクラスで同じエンティティのmanaferが必要ですか?実際には、同じエンティティマネージャを使用したいと思うかもしれません。なぜなら、リクエスト間でトランザクションを制御するということです。しかし、この場合、独自のテストクライアントクラスを拡張してsymfonyの拡張クラスを作成し、静的接続またはエンティティマネージャを定義し、リクエストがあるたびにコンテナに挿入する必要があります。例で

ルック: http://alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests

+0

貴重なご回答ありがとうございました。この場合、フォームが新しい電子メールをデータベースに保存したかどうかをテストしたいだけです。だから、あなたの意見で最高ですね?すべての要求の前にエンティティマネージャとコンテナを配置するために私自身のテストクライアントを作成しますか?助けていただきありがとうございます、私は正しく動作し続けることができます! – rgazelot

+2

何かが正しく追加されているかどうかを確認したいのであれば、デフォルトのクライアントからエンティティマネージャを使用していない理由(コメントされたスニペットのやり方で)エンティティマネージャのインスタンスを保持する必要はありません。私は自分のテストクライアントを使用して、データベースに新しい行が追加されているかどうかをチェックしてからトランザクションをロールバックする(データベースを変更したくないため)。 – Cyprian

+0

そうですか。ご協力ありがとうございました。私はこれを迅速に実装しようとします。 – rgazelot

関連する問題