【问题标题】:Symfony : Detached entity cannot be removed in test suite w/ phpunitSymfony:无法在带有 phpunit 的测试套件中删除分离的实体
【发布时间】:2016-10-30 15:19:58
【问题描述】:

我实际上正在对我的 api 进行一些功能测试,但我遇到了一个我不太了解的问题。

我想测试一个与远程 Web 托管服务器交互的 API。目标是管理虚拟主机、DNS 区域、数据库等... 我有一个测试远程服务器,为了避免冲突,我在测试后删除了创建的东西(在TearDown() 函数中)并创建基础(在setUp() 函数中)。在setUp() 中,我还在设置中加载了固定装置。

在添加我的主要实体的子实体的测试之后,我想清理远程服务器:

$service = $this->fixtures->getReference('service-web');
$this->container->get('webmanager')->deleteHosting($service, true);

deleteHosting() 函数删除所有远程的东西(真正的参数是“force”参数,它确保函数在出错后不会停止。

$service 变量包含我的主要服务实体。在这个实体中,我还与addonDomain 的实体存在一对多关系。 我的功能测试创建了一个 addonDomain。 测试没问题,但是当我尝试删除我的服务时,附加的实体让 Doctrine 大喊大叫:Doctrine\ORM\ORMInvalidArgumentException: Detached entity AppBundle\Entity\Service\Web\AddonDomain@0000000054814da900000000073c524a cannot be removed

我尝试了很多东西,但都没有奏效(即:使用学说管理器来检索实体而不是使用夹具。

非常感谢您的帮助, 最好的问候。

已解决! 事实上,我使用的是测试类的容器和实体管理器,而不是客户端自己的。这就是问题所在……

【问题讨论】:

  • 我有同样的问题,不知道如何解决它:/
  • 这件事发生在一年前,我记不太清了。但正如在原始帖子中更新的那样,不要使用$this->container,而是尝试在setUp()tearDown 方法中使用self::$container。希望这会有所帮助。
  • 在实体上调用remove 之前,我通过调用merge 解决了这个问题。不确定它是最好的方法,但它有效!不过感谢您的回复!
  • 使用$this->em = static::$kernel->getContainer()->get('doctrine.orm.entity_manager');$this->em = $this->client->getContainer()->get('doctrine.orm.entity_manager'); 甚至em->merge(..) 都没有变化。仅当我逐个刷新实体而不是单个 flush() 时,我的实体才被删除。

标签: php symfony doctrine-orm phpunit


【解决方案1】:

虽然这是一个老问题,但我最近在使用 Symfony 4.4 时遇到了同样的问题,Detached entity error in Doctrine 帮助我解决了这个问题。基本上,正如@Can Vural 建议的那样,在 remove 之前调用 merge 可以解决问题,但缺少的一点是您必须再次分配实体,所以:

$entity = $doctrineManager->merge($detachedEntity);  
$doctrineManager->remove($entity);
$doctrineManager->flush();

这解决了我的问题。

请记住,merge 已被弃用,将在 Doctrine 3 中删除:https://github.com/doctrine/orm/blob/master/UPGRADE.md#bc-break-removed-entitymanagermerge-and-entitymanagerdetach-methods

【讨论】:

猜你喜欢
  • 2018-06-22
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多