Ho una domanda per il test di Symfony FormType. http://symfony.com/doc/current/cookbook/form/unit_testing.htmlSymfony FormType contratto di prova con EntityType
Nei miei tipi di modulo il tipo entity
è comune. Testare i tipi di modulo con un tipo di modulo entità dottrina è orribile.
Questo è il mio campo modulo.
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('products', 'entity', array(
'class' => 'AcmeDemoBundle:Product',
'label' => 'Product',
'property' => 'name',
'required' => false,
'mapped' => true,
'multiple' => true,
'expanded' => true
));
}
Ed ecco il mock per il campo.
private function getEntityTypeMock()
{
$entityRepositoryMock = $this->getMockBuilder('Doctrine\ORM\EntityRepository')
->disableOriginalConstructor()
->getMock()
;
$entityRepositoryMock->expects($this->once())
->method('findAll')
->will($this->returnValue(array()));
$classMetaDataMock = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')
->disableOriginalConstructor()
->getMock();
$mockEntityManager = $this->getMockBuilder('Doctrine\ORM\EntityManager')
->disableOriginalConstructor()
->getMock();
$mockEntityManager->expects($this->any())
->method('getClassMetadata')
->will($this->returnValue($classMetaDataMock));
$mockEntityManager->expects($this->once())
->method('getRepository')
->will($this->returnValue($entityRepositoryMock));
$mockRegistry = $this->getMockBuilder('Doctrine\Bundle\DoctrineBundle\Registry')
->disableOriginalConstructor()
->getMock();
$mockRegistry->expects($this->any())
->method('getManagerForClass')
->will($this->returnValue($mockEntityManager));
$mockEntityType = $this->getMockBuilder('Symfony\Bridge\Doctrine\Form\Type\EntityType')
->setMethods(array('getName'))
->setConstructorArgs(array($mockRegistry))
->getMock();
$mockEntityType->expects($this->any())->method('getName')
->will($this->returnValue('entity'));
return $mockEntityType;
}
È davvero il modo corretto? Dentro lo TypeTestCase
non ho accesso a niente, nessun contenitore nessun kernel, niente. Questo rende il test di un tipo di modulo piuttosto difficile e frustrante.
C'è un modo migliore per testare i tipi di modulo? O un modo più semplice per gestire i tipi che hanno una dipendenza ORM?
Cheers.
Attualmente, Symfony supporta EntityType fuori dalla scatola, ma non ha un modo corretto di testarlo unitamente: https://github.com/symfony/symfony/issues/15098. –
La difficoltà di testare EntityType deriva dalla classe che estende DoctrineType. DoctrineType viene fornito con un codice di codice troppo elevato come funzioni di unonymouse che fa tutta la magia. Trovo molto facile estendere il CoiceType, registrarlo come servizio e iniettare il repository piuttosto che usare EntityType. Provarlo è semplice, iniettare un DummyRepository. – albert