Symfony 和学说:对象未在搜索中更新
Symfony & doctrine : object not updated in a search
我正在 phpUnit 中测试某个动作。
在我的测试中,我从容器中获取了实体管理器。我创建了一个实体 $finalisation,然后将它插入我的 table :
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)
}
此操作旨在通过服务 (GestionnaireFinalisation) 更改 $finalisation 对象:$finalisation 的字段 finaliseParAuteur 从 false 变为 true。
现在,我有了名为 GestionnaireFinalisation 的服务,它可以转换字段
对象 $finalisation 从 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);
}
}
现在的问题是:
当我在测试中搜索 $finalisation 时,似乎我没有修改对象:
$finalisation = $em->getRepository(Finalisation::class)
->someMethodToGetTheFinalisationUpdated();
证明:当我转储 $finalisation 时,我进入了 dateCreation 和 dateUpdate 相同的 DateTime,这不应该是这种情况,因为对象在服务中被函数 finalisationParAuteur 修改了。
我怀疑问题出在两个实体管理器上(一个在测试中,另一个在服务中)。
非常感谢任何帮助!
谢谢!
经过一番努力,我找到了解决方案。
就是这个,希望对大家有帮助!
当我用实体管理器调用服务时,$finalisation 被修改。并且在测试中,$finalisation 仍然指向旧版本的对象。
解决方案是使用刷新方法(我以前从未使用过):
$em->refresh($finalisation);
此方法刷新了对象,所以我得到了在服务中进行的所有修改的对象!
我正在 phpUnit 中测试某个动作。
在我的测试中,我从容器中获取了实体管理器。我创建了一个实体 $finalisation,然后将它插入我的 table :
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)
}
此操作旨在通过服务 (GestionnaireFinalisation) 更改 $finalisation 对象:$finalisation 的字段 finaliseParAuteur 从 false 变为 true。
现在,我有了名为 GestionnaireFinalisation 的服务,它可以转换字段 对象 $finalisation 从 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);
}
}
现在的问题是:
当我在测试中搜索 $finalisation 时,似乎我没有修改对象:
$finalisation = $em->getRepository(Finalisation::class)
->someMethodToGetTheFinalisationUpdated();
证明:当我转储 $finalisation 时,我进入了 dateCreation 和 dateUpdate 相同的 DateTime,这不应该是这种情况,因为对象在服务中被函数 finalisationParAuteur 修改了。
我怀疑问题出在两个实体管理器上(一个在测试中,另一个在服务中)。
非常感谢任何帮助!
谢谢!
经过一番努力,我找到了解决方案。
就是这个,希望对大家有帮助!
当我用实体管理器调用服务时,$finalisation 被修改。并且在测试中,$finalisation 仍然指向旧版本的对象。
解决方案是使用刷新方法(我以前从未使用过):
$em->refresh($finalisation);
此方法刷新了对象,所以我得到了在服务中进行的所有修改的对象!