Проблема с менеджером сущностей и 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 я могу получить доступ к новому менеджеру сущностей...
1 answers
Вы не можете получить доступ к новому менеджеру сущностей, потому что ядро клиентского класса Symfony отключается перед каждым запросом, что означает, что он стирает весь контейнер службы и создает его заново с нуля.
Итак, после ВТОРОГО запроса вы получаете совсем другой менеджер сущностей, чем тот, который у вас есть в вашем собственном классе WebTestCase. (Я сказал через секунду, потому что ядро клиента завершает работу только в том случае, если какой-либо запрос уже был выполнен)
Вопрос в том, действительно ли вам нужна одна и та же сущность манафер в вашем классе WebTestCase? На самом деле, вы можете использовать один и тот же менеджер сущностей, потому что вы хотите, скажем, контролировать транзакции между запросами. Но в этом случае вам следует создать свой собственный тестовый клиентский класс, расширенный symfony, и там определить статическое соединение или диспетчер сущностей, и помещать его в контейнер перед каждым запросом.
Посмотрите на пример: http://alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests