我正在为 Symfony2 项目进行测试,现在我正在寻找一种方法来创建涉及实体对象的测试而不持久化它们。问题是:id是一个私有字段,没有设置器。我可以创建新对象并设置一些属性,但我无法测试涉及getId()调用的任何内容。
$entity = new TheEntity();
// Can't set ID!
$entity->setProperty('propertyValue');
$name = $entity->getProperty(); // OK
$id = $entity->getId(); // not OK - null
我知道的决议:
- 初始化整个内核(Symfony 的WebTestCase::createKernel())并持久化实体
- 为每个实体创建一个模拟对象,该对象将返回有效 ID
- 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。
仍然欢迎任何有价值的输入,但我相信 PHPUnitgetMock()
很好地解决了这个问题。