Symfony 2中的实体管理器和phpunit问题

rga*_*lot 5 php phpunit symfony doctrine-orm symfony-2.1

我的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()));
}
Run Code Online (Sandbox Code Playgroud)

这是我的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,
        ));
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,我在创建客户端时替换了self :: $ em.

我的问题:

在我的测试中,die()给我旧的电子邮件,而不是new@email.com在测试中注册的新电子邮件().但是在我的数据库中,我已new@email.com正确保存.

当我在数据库中检索我的用户时,我使用sefl::$em.如果我使用$emin评论,我会检索正确的新电子邮件.

我不明白为什么在我的WebTestCase中,我可以访问新的实体管理器...

Cyp*_*ian 4

您无法访问新的实体管理器,因为 Symfony 的客户端类在每次请求之前都会关闭内核,这意味着它会擦除整个服务容器并从头开始重新构建。

因此,在第二个请求之后,您将获得与您自己的 WebTestCase 类中的实体管理器截然不同的实体管理器。(我说第二秒之后是因为只有在任何请求已经执行时客户端才会关闭内核)

问题是 - 您的 WebTestCase 类中真的需要相同的实体管理器吗?实际上,您可能想要使用相同的实体管理器,因为您想要控制请求之间的事务。但在这种情况下,您应该创建自己的测试客户端类扩展 symfony 的测试客户端类,并定义静态连接或实体管理器,并在每个请求之前将其放入容器中。

看示例: http ://alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests

  • 如果您只想检查某些内容是否已正确添加,为什么您不只使用默认客户端中的实体管理器(就像您在注释片段中所做的那样)?我看不出有任何必要保留实体管理器的实例。我在我想要检查新行是否添加到数据库然后回滚事务的情况下使用我自己的测试客户端(因为我不希望我的测试修改数据库)。 (2认同)