5

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]' => 'new@email.com',
    )));

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

    $user = self::$em->getRepository('MyBundle:User')->findUser('new@email.com');

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

ご覧のとおり、クライアントを作成したときに self::$em を置き換えます。

私の問題:

私のテストでは、テストに登録されたdie()新しい電子メール ( ) ではなく、古い電子メールが返されます。new@email.comただし、私のデータベースでは、new@email.com正しく保存されています。

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

WebTestCase で新しい Entity Manager にアクセスできる理由がわかりません...

4

1 に答える 1

4

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

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

問題は、WebTestCase クラスに同じエンティティ マネージャが本当に必要かということです。実際には、リクエスト間のトランザクションを制御したいので、同じエンティティマネージャーを使用したい場合があります。しかし、この場合、symfony のものを拡張した独自のテスト クライアント クラスを作成し、そこで静的接続またはエンティティ マネージャーを定義し、すべてのリクエストの前にコンテナーに配置する必要があります。

例を見てください: http://alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests

于 2012-10-10T18:06:06.187 に答える