Como criar testes com entidades Doctrine sem persisti-los (como definir id)
Estou trabalhando em testes para um projeto Symfony2, e agora estou procurando uma maneira de criar testes envolvendo objetos de entidade sem persistir neles. O problema é:identidade é um campo privado e não há setter para isso. Eu posso criar um novo objeto e definir algumas propriedades, mas não posso testar nada que envolvagetId () chamadas.
$entity = new TheEntity();
// Can't set ID!
$entity->setProperty('propertyValue');
$name = $entity->getProperty(); // OK
$id = $entity->getId(); // not OK - null
As resoluções que conheço:
Inicializando o kernel inteiro (o SymfonyWebTestCase :: createKernel ()) e persistindo as entidadesCriando um objeto simulado para cada entidade, que retornará um ID válidoHacks como método estático emA entidade classe retornando objeto inicializado, ou adicionando setter paraidentidade campoQual é a maneira recomendada de lidar com isso, como obter uma entidade para testes de maneira limpa e rápida, com o ID do conjunto?
Editar
Acabou que eu posso resolver isso com zombaria ... desculpe, eu ainda estou aprendendo. Eu estava procurando por uma maneira limpa, padrão e rápida de fazer as coisas. No entanto, eu esqueci o segundo parâmetro degetMock()
- isso éEu não tenho que zombar de todos os métodos da entidade que vou usar. Eu queria evitar múltiplos->expects()->method()->will()
etc. E isso é conseguido adicionando:array('getId')
. Este método auxiliar resolve o problema:
protected function getEntityMock($entityClass, $id)
{
$entityMock = $this->getMock($entityClass, array('getId'));
$entityMock
->expects($this->any())
->method('getId')
->will($this->returnValue($id));
return $entityMock;
}
Ao criar muitas entidades da mesma classe, é claro que as coisas podem ser simplificadas mais por métodos auxiliares como este:
protected function getTheEntityMock($id)
{
return $this->getEntityMock('\The\NameSpace\TheEntity', $id);
}
O únicolimitação é que a entidade em si não pode usarid
propriedade, apenasgetId()
getter.
Qualquer entrada valiosa ainda é bem-vinda, mas acredito no PHPUnitgetMock()
resolvido isso bem.