Я тестирую определенное действие в phpUnit.
В моем тесте я получаю диспетчер сущностей из контейнера. Я создаю объект $ finalization, а затем вставляю его в свою таблицу:
public function testAction()
{
self::bootKernel();
$em = static::$kernel->getContainer()
->get('doctrine')
->getManager()
;
//I create some $finalisation entity, and insert it
(...)
$em->persist($finalisation);
$em->flush();
//I call then the action to test (my function authentification works well)
$crawler = $this->authentification("/annonce/finaliser-annonce/annonce-en-cours-4");
// (... MORE CODE SEE BELOW)
}
Это действие предназначено для изменения объекта $ finalization через службу (GestionnaireFinalisation): значение поля finaliseParAuteur $ finalization изменяется с false на true.
Теперь у меня есть служба под названием GestionnaireFinalisation, которая преобразует поле в финализация объекта $ из FALSE в TRUE
class GestionnaireFinalisation
{
protected $em;
public function __construct(EntityManager $entityManager){
$this->em = $entityManager;
}
public function finalisationParAuteur($annonceEnCours, $profilAuteur)
{
$finalisation = $this->em->getRepository('AppBundle:Finalisation')
->findFinalisationParProfilAuteur($annonceEnCours, $profilAuteur);
if ($finalisation->getFinaliseParPresta())
{
// ... THIS CODE IS NOT RUN
}
else
{
//THIS IS THE CODE WHICH IS RUN
$finalisation->setFinaliseParAuteur(true);
$this->em->flush();
return (false);
}
}
Теперь проблема:
когда я ищу в тесте $ finalization, оказывается, что я не изменяю объект:
$finalisation = $em->getRepository(Finalisation::class)
->someMethodToGetTheFinalisationUpdated();
Доказательство: когда я сбрасываю $ finalization, я получил в dateCreation и dateUpdate тот же DateTime, чего не должно быть, потому что объект был изменен в службе функцией finalisationParAuteur.
Я подозреваю, что проблема связана с двумя менеджерами сущностей (один в тесте, а другой в службе).
Любая помощь будет очень признательна!
Спасибо !




Я нашел решение после некоторой борьбы.
Вот оно, надеюсь, это поможет кому-то другому!
Когда я вызываю службу с помощью диспетчера сущностей, $ finalization изменяется. И в тесте $ finalization по-прежнему указывает на старую версию объекта.
Решение состоит в том, чтобы использовать метод обновления (который я никогда раньше не использовал):
$em->refresh($finalisation);
Этот метод обновляет объект, поэтому я получаю объект со всеми изменениями, внесенными в службу!