Ich habe eine Frage zu Symfony FormType testen. http://symfony.com/doc/current/cookbook/form/unit_testing.htmlSymfony FormType Test Deal mit EntityType
In meinem Formulartyp die entity
Art ist weit verbreitet. Das Testen der Formulartypen mit einem Dokumentinformations-Typ ist schrecklich.
Dies ist mein Formularfeld.
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
));
}
Und hier ist der Spott für das Feld.
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;
}
Ist das wirklich der richtige Weg? Innerhalb der TypeTestCase
habe ich keinen Zugriff auf irgendetwas, keinen Container, keinen Kernel, nichts. Dies macht das Testen eines Formulartyps ziemlich schwierig und frustrierend.
Gibt es eine bessere Möglichkeit, die Formulartypen zu testen? Oder eine einfachere Möglichkeit, mit Typen umzugehen, die eine ORM-Abhängigkeit haben?
Prost.
Momentan unterstützt Symfony den EntityType out of the box, aber es gibt keinen geeigneten Weg, Unit-Test zu testen: https://github.com/symfony/symfony/issues/15098. –
Die Schwierigkeit beim Testen des EntityType kommt von der Klasse DoctrineType. DoctrineType kommt mit zu viel Code als anonyme Funktionen, die die ganze Magie tut. Ich finde es sehr einfach, den CoiceType zu erweitern, ihn als Dienst zu registrieren und das Repository zu injizieren, anstatt EntityType zu verwenden. Testen Sie es einfach, injizieren Sie ein DummyRepository. – albert