Проблема с менеджером сущностей и 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,
        ));
    }

Как вы можете видеть, я заменяю self::$em, когда создавал своего клиента.

Моя проблема:

В моем тесте die() дает мне старое электронное письмо, а не новое электронное письмо ([email protected]), которое было зарегистрировано в тесте. Однако в моей базе данных у меня есть [email protected] правильно сохраненный.

Когда я получаю своего пользователя в базу данных я использую sefl::$em. Если я использую $em в комментариях, я получаю правильное новое электронное письмо.

Я не понимаю, почему в моем WebTestCase я могу получить доступ к новому менеджеру сущностей...

Author: edorian, 2012-10-10

1 answers

Вы не можете получить доступ к новому менеджеру сущностей, потому что ядро клиентского класса Symfony отключается перед каждым запросом, что означает, что он стирает весь контейнер службы и создает его заново с нуля.

Итак, после ВТОРОГО запроса вы получаете совсем другой менеджер сущностей, чем тот, который у вас есть в вашем собственном классе WebTestCase. (Я сказал через секунду, потому что ядро клиента завершает работу только в том случае, если какой-либо запрос уже был выполнен)

Вопрос в том, действительно ли вам нужна одна и та же сущность манафер в вашем классе WebTestCase? На самом деле, вы можете использовать один и тот же менеджер сущностей, потому что вы хотите, скажем, контролировать транзакции между запросами. Но в этом случае вам следует создать свой собственный тестовый клиентский класс, расширенный symfony, и там определить статическое соединение или диспетчер сущностей, и помещать его в контейнер перед каждым запросом.

Посмотрите на пример: http://alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests

 4
Author: Cyprian, 2012-10-10 18:06:06