gpt4 book ai didi

symfony - 如何使用 Doctrine 实体创建测试而不持久化它们(如何设置 id)

转载 作者:行者123 更新时间:2023-11-28 19:41:19 25 4
gpt4 key购买 nike

我正在为一个 Symfony2 项目进行测试,现在我正在寻找一种方法来创建涉及实体对象的测试而无需持久化它们。问题是:id 是私有(private)字段,没有相应的 setter。我可以创建新对象并设置一些属性,但我无法测试任何涉及 getId() 调用的内容。

$entity = new TheEntity();
// Can't set ID!
$entity->setProperty('propertyValue');

$name = $entity->getProperty(); // OK
$id = $entity->getId(); // not OK - null

我知道的决议:

  1. 初始化整个内核(Symfony 的 WebTestCase::createKernel())并持久化实体
  2. 为每个实体创建一个模拟对象,它将返回有效的 ID
  3. 黑客喜欢 TheEntity 类中的静态方法返回初始化对象,或为 id 字段添加 setter

处理此问题的推荐方法是什么,如何以干净快速的方式获取用于测试的实体,并设置 ID?

编辑

原来我可以通过模拟来解决这个问题...抱歉,我还在学习。我一直在寻找一种干净、标准但快速的方法来完成工作。但是我忘记了 getMock() 的第二个参数 - 即 我不必模拟我将要使用的实体的每个方法。我想避免多个 ->expects()->method()->will() 等。这是通过添加:array('getId') 实现的。这个辅助方法解决了这个问题:

protected function getEntityMock($entityClass, $id)
{
$entityMock = $this->getMock($entityClass, array('getId'));
$entityMock
->expects($this->any())
->method('getId')
->will($this->returnValue($id));

return $entityMock;
}

当创建同一个类的许多实体时,当然可以通过更多像这样的辅助方法来简化事情:

protected function getTheEntityMock($id)
{
return $this->getEntityMock('\The\NameSpace\TheEntity', $id);
}

唯一的限制是实体本身不能使用id属性,只能使用getId() getter。

仍然欢迎任何有值(value)的输入,但我相信 PHPUnit 的 getMock() 很好地解决了这个问题。

最佳答案

它有点旧,但值得一提的是,也许最好的方法是使用使用 Reflection 的辅助方法。更改那些 protected 值。

示例:

public function set($entity, $value, $propertyName = 'id')
{
$class = new ReflectionClass($entity);
$property = $class->getProperty($propertyName);
$property->setAccessible(true);

$property->setValue($entity, $value);
}

把它放在你扩展的基础测试类中,或者把它放在 trait 中,当你在测试中需要类似的东西时就使用它。通过这种方式,您将能够编写测试而无需创建脏更改。

关于symfony - 如何使用 Doctrine 实体创建测试而不持久化它们(如何设置 id),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19368274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com