Cómo crear pruebas con entidades de Doctrine sin persistir en ellas (cómo establecer la identificación)
Estoy trabajando en pruebas para un proyecto Symfony2, y en este momento estoy buscando una manera de crear pruebas que involucren objetos de entidad sin persistir en ellos. El problema es:carné de identidad Es un campo privado y no hay setter para eso. Puedo crear un nuevo objeto y establecer algunas propiedades, pero no puedo probar nada que involucregetId () llamadas
$entity = new TheEntity();
// Can't set ID!
$entity->setProperty('propertyValue');
$name = $entity->getProperty(); // OK
$id = $entity->getId(); // not OK - null
Las resoluciones que conozco:
Inicializando kernel entero (Symfony'sWebTestCase :: createKernel ()) y persistiendo las entidadesCreando un objeto simulado para cada entidad, que devolverá una identificación válidaHacks como método estático en.La entidad clase que devuelve el objeto inicializado, o que agrega settercarné de identidad campo¿Cuál es la forma recomendada de lidiar con esto, cómo obtener una entidad para realizar pruebas de forma limpia y rápida, con el ID de conjunto?
Editar
Resultó que puedo resolver esto con burla ... lo siento, todavía estoy aprendiendo. Estaba buscando una manera limpia, estándar y rápida de hacer las cosas. Sin embargo me olvidé del segundo parámetro degetMock()
- es decirNo tengo que burlarme de todos los métodos de la entidad que voy a usar.. Queria evitar multiples->expects()->method()->will()
Y esto se logra agregando:array('getId')
. Este método auxiliar resuelve el problema:
protected function getEntityMock($entityClass, $id)
{
$entityMock = $this->getMock($entityClass, array('getId'));
$entityMock
->expects($this->any())
->method('getId')
->will($this->returnValue($id));
return $entityMock;
}
Cuando se crean muchas entidades de la misma clase, las cosas se pueden simplificar, por supuesto, más con más métodos auxiliares como este:
protected function getTheEntityMock($id)
{
return $this->getEntityMock('\The\NameSpace\TheEntity', $id);
}
Lo únicolimitación es que la entidad en sí no puede usarid
solo propiedadgetId()
adquiridor.
Cualquier aportación valiosa aún es bienvenida, pero creo que PHPUnitgetMock()
Resuelto este bien.