-->

发行与实体管理器和PHPUnit的在Symfony的2(Issue with the Entity

2019-09-23 22:17发布

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

正如你所看到的,我更换时,我创造了我的客户自:: $他们。

我的问题:

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

当我找回我的数据库中的用户,我使用sefl::$em 。 如果我使用$em的意见,我找回正确的新邮件。

我不明白,为什么在我的WebTestCase,我可以接触到新的实体管理器...

Answer 1:

您不能访问新的实体管理器,因为每个请求之前的Symfony的客户端类关闭的内核,这意味着它删除整个服务容器,并从头构建它。

所以,第二个请求后,你会得到完全不同的实体管理器比一个你在自己的WebTestCase类都有。 (我秒钟后表示,由于客户端关机的内核只有当任何要求已经进行)

现在的问题是 - 你真的需要在您的WebTestCase类相同的实体manafer? 其实,你可能需要使用相同的实体管理器,因为你想要让发言权得到控制研究过请求之间的交易。 但在这种情况下,你应该创建自己的测试客户端类扩展symfony中的一个有定义静态连接或实体管理器,并把它倒入容器中每一个请求之前。

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



文章来源: Issue with the Entity Manager and phpunit in Symfony 2