Я работаю над тестами для проекта 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()) и сохранение сущностей
- Создание макета для каждой сущности, которая вернет действительный идентификатор
- Взломается как статический метод в классе TheEntity, возвращающем инициализированный объект, или добавление setter для поля id
Каков рекомендуемый способ справиться с этим, как получить объект для тестирования чистым и быстрым способом с идентификатором набора?
Edit
Оказалось, что я могу решить это с насмешкой... извините, я все еще учусь. Я искал чистый, стандартный, но быстрый способ добиться успеха. Однако я забыл о втором параметре 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.
Любые ценные данные по-прежнему приветствуются, но я верю, что PHPUnit getMock()
решил это хорошо.