2013-05-03 4 views
8

Ich teste einen Formulartyp, den ich für eine Anwendung definiert habe. Beim Testen des Formulartyps wird mit der TypeTestCase-Klasse von symfony die Meldung "Entitätstyp kann nicht geladen werden" angezeigt. Was kann ich tun, um das Problem zu lösen?Testen von Symfony2 Forms causes Konnte den Typ "entity" nicht laden

class MyType extends AbstractType { 
    public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder->add('otherType', 'entity', array('class' => 'Bundle:OtherType')); 
    } 
} 

class MyTypeTest extends TypeTestCase { 
    public function testSth() { 
    $type = new MyType(); 
    } 
} 
+0

Bitte , geben Sie den entsprechenden Code an. Danke – DonCallisto

+0

Code hinzugefügt, sry für das Vergessen! – Benny

+0

Mir scheint es gibt keinen Fehler, aber sicher, dass wir etwas vermissen ... – DonCallisto

Antwort

13

Ich habe bereits das gleiche Problem beim Testen von einigen meiner angepassten Typen.

Hier ist die Art, wie ich es herausfinden (von EntityType spöttisch),

Zuerst Ihre Testklasse TypeTestCase, in stellen Sie sicher,

class MyTypeTest extends TypeTestCase 
{ 
    // ... 
} 

Dann fügen Sie eine preloaded extension auf Ihre form factory erstreckt Um die EntityType

protected function setUp() 
{ 
    parent::setUp(); 

    $this->factory = Forms::createFormFactoryBuilder() 
     ->addExtensions($this->getExtensions()) 
     ->getFormFactory(); 
} 
// Where this->getExtensions() returns the EntityType preloaded extension 
// (see the last step)  
} 
zu berücksichtigen

Und schließlich, fügen Sie einen Entity Type Mock zu Ihrem preloaded extension hinzu.

protected function getExtensions() 
{ 
    $mockEntityType = $this->getMockBuilder('Symfony\Bridge\Doctrine\Form\Type\EntityType') 
     ->disableOriginalConstructor() 
     ->getMock(); 

    $mockEntityType->expects($this->any())->method('getName') 
        ->will($this->returnValue('entity')); 

    return array(new PreloadedExtension(array(
      $mockEntityType->getName() => $mockEntityType, 
    ), array())); 
} 

Aber Sie können müssen ...

Mock die registry dass DoctrineType als Parameter übernimmt, wenn die Standard Konstruktor aufrufen, weil sie von setDefaultOptions() (Beachten Sie, dass EntityType erstreckt DoctrineType) verwendet wird zu berücksichtigen class und property Optionen Ihrer Entity field.

Ihr kann dann müssen die entityType wie folgt verspotten:

$mockEntityManager = $this->getMockBuilder('\Doctrine\ORM\EntityManager')->getMock(); 

$mockRegistry = $this->getMockBuilder('Doctrine\Bundle\DoctrineBundle\Registry') 
    ->disableOriginalConstructor() 
    ->setMethods(array('getManagerForClass')) 
    ->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')); 
+13

Hallo, ich folgte dem, was Sie gepostet haben, aber ich bekam einen Fehler: Rufen Sie protected \ ORM \ EntityManager :: __ construct() aus dem Kontext 'PHPUnit_Framework_MockObject_Generator' in/usr/share/php/PHPUnit/Framework/MockObject/Generator auf. php on line 237 – skonsoft

+0

@Ahmed Siouani Können Sie bitte den obigen Kommentar beantworten –

+0

Ich bekomme den gleichen Fehler wie @Skonsoft.Können Sie uns bitte eine mögliche Lösung dafür nennen? –

0

Die Antwort des Ahmed Siouani ist gut writted und mir erlaubt, zu verstehen, wie eine Extension im TypeTestCase hinzuzufügen.

Aber wenn Sie einen Intergration Test machen wollen, die viel einfacher als ein Unit-Test in diesem Fall ist, können Sie wie folgt tun:

protected function getExtensions() 
{ 
    $childType = new TestChildType(); 
    return array(new PreloadedExtension(array(
     $childType->getName() => $childType, 
    ), array())); 
} 

Wie in dieser Dokumentation beschrieben: http://symfony.com/doc/current/cookbook/form/unit_testing.html#adding-a-type-your-form-depends-on

Verwandte Themen