Doctrine orm 使用数据设备管理实体ID

Doctrine orm 使用数据设备管理实体ID,doctrine-orm,doctrine,fixtures,Doctrine Orm,Doctrine,Fixtures,我面临着一个关于条令数据装置的问题:当我使用装置插入一些数据以运行验收测试时,我是否能够以某种方式确保使用特定ID持久化特定实体 例如,我创建了几个示例用户,然后运行验收测试编辑其中一个用户。我需要知道这个测试用例的用户ID。 处理此问题的最佳做法是什么? 是否可以对装置创建的某些实体的ID进行硬编码,或者是否应将生成的ID存储到单独的表、文件等中以查找请求的实体?或者还有其他最佳实践吗 提前感谢。在我们的应用程序中,我们将实体设置为这些装置的静态属性,以便在测试中轻松使用 class Cate

我面临着一个关于条令数据装置的问题:当我使用装置插入一些数据以运行验收测试时,我是否能够以某种方式确保使用特定ID持久化特定实体

例如,我创建了几个示例用户,然后运行验收测试编辑其中一个用户。我需要知道这个测试用例的用户ID。 处理此问题的最佳做法是什么? 是否可以对装置创建的某些实体的ID进行硬编码,或者是否应将生成的ID存储到单独的表、文件等中以查找请求的实体?或者还有其他最佳实践吗


提前感谢。

在我们的应用程序中,我们将实体设置为这些装置的静态属性,以便在测试中轻松使用

class CategoryTestFixture
extends\Doctrine\Common\DataFixture\AbstractFixture
工具
\条令\Common\DataFixtures\OrderedFixtureInterface,
\Symfony\Component\DependencyInjection\ContainerWareInterface
{
/**@var\My\Category*/
公共静态类别;
/**@var\My\Category*/
公共静态分类;
/**@var\Symfony\Component\DependencyInjection\ContainerInterface*/
私人集装箱;
公共函数加载(ObjectManager$manager)
{
self::$foocegory=新类别('Foo');
$entityManager->persist(self::$fooCategory);
self::$barCategory=新类别('Bar');
$entityManager->persist(自身::$barCategory);
$entityManager->flush();
}
//你可以注入容器,
//所以你可以在固定装置中使用你的正面
公共函数getContainer():ContainerInterface
{
返回$this->container;
}
公共函数setContainer(ContainerInterface$container=null)
{
$this->container=$container;
}
}
这方面有几个重要规则:

  • 确保不要在fixture中调用
    $em->clear()
    ,以便可以直接使用其他fixture类中的实体
  • 加载装置后调用
    $em->clear()
    ,这样它们就不会影响测试
  • 在每次测试之前,复制准备好的数据库,并将该副本用于测试,而不是“模板数据库”。因此,您可以安全地修改数据。它可以进一步优化,但这是最简单的解决方案
  • 不要将测试中的原始装置合并或尝试注册为托管装置
现在已经创建了装置,可以像这样使用它们

$id=CategoryTestFixture::$barCategory->getId();
此外,您可以引用它们的所有属性,而不仅仅是ID。因此,如果您想断言,您的api返回了正确的类别,您可以这样做

$this->assertArraySubset([
[
'id'=>CategoryTestFixture::$fooCategory->getId(),
'name'=>CategoryTestFixture::$fooCategory->getName(),
],
[
'id'=>CategoryTestFixture::$barCategory->getId(),
'name'=>CategoryTestFixture::$barCategory->getName(),
]
](),;
如果只想修改一个测试用例的数据,请使用fixture的属性修改数据库,然后清除EM afterwards,这样就不会对实体管理器中已经填充的标识映射产生副作用

$barCategory=$entityManager->find(
类别::类,
CategoryTestFixture::$barCategory->getId()
);
$barCategory->setName(“另一个名称”);
$entityManager->flush();
$entityManager->clear();

在我们的应用程序中,我们将实体设置为这些装置的静态属性,以便可以轻松地从测试中使用它们

class CategoryTestFixture
extends\Doctrine\Common\DataFixture\AbstractFixture
工具
\条令\Common\DataFixtures\OrderedFixtureInterface,
\Symfony\Component\DependencyInjection\ContainerWareInterface
{
/**@var\My\Category*/
公共静态类别;
/**@var\My\Category*/
公共静态分类;
/**@var\Symfony\Component\DependencyInjection\ContainerInterface*/
私人集装箱;
公共函数加载(ObjectManager$manager)
{
self::$foocegory=新类别('Foo');
$entityManager->persist(self::$fooCategory);
self::$barCategory=新类别('Bar');
$entityManager->persist(自身::$barCategory);
$entityManager->flush();
}
//你可以注入容器,
//所以你可以在固定装置中使用你的正面
公共函数getContainer():ContainerInterface
{
返回$this->container;
}
公共函数setContainer(ContainerInterface$container=null)
{
$this->container=$container;
}
}
这方面有几个重要规则:

  • 确保不要在fixture中调用
    $em->clear()
    ,以便可以直接使用其他fixture类中的实体
  • 加载装置后调用
    $em->clear()
    ,这样它们就不会影响测试
  • 在每次测试之前,复制准备好的数据库,并将该副本用于测试,而不是“模板数据库”。因此,您可以安全地修改数据。它可以进一步优化,但这是最简单的解决方案
  • 不要将测试中的原始装置合并或尝试注册为托管装置
现在已经创建了装置,可以像这样使用它们

$id=CategoryTestFixture::$barCategory->getId();
此外,您可以引用它们的所有属性,而不仅仅是ID。因此,如果您想断言,您的api返回了正确的类别,您可以这样做

$this->assertArraySubset([
[
'id'=>CategoryTestFixture::$fooCategory->getId(),
'name'=>CategoryTestFixture::$fooCategory->getName(),
],
[
'id'=>CategoryTestFixture::$barCategory