2013-05-03 95 views
8

我正在测试为应用程序定义的表单类型。在测试表单类型的过程中,使用symfony的TypeTestCase类会出现消息“无法加载类型”实体“”。我能做些什么来解决问题?测试Symfony2表单的原因无法加载类型“实体”

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

请,提供相关的代码。谢谢 – DonCallisto 2013-05-03 09:29:19

+0

添加代码,忘记它吧! – Benny 2013-05-03 09:36:01

+0

对我来说似乎没有任何错误,但肯定我们错过了一些东西... – DonCallisto 2013-05-03 09:45:17

回答

13

我在测试一些自定义类型时已经遇到同样的问题。

这里是我弄明白(由嘲讽的EntityType)的方式,

首先,确保你的测试类扩展TypeTestCase

class MyTypeTest extends TypeTestCase 
{ 
    // ... 
} 

然后,添加一个preloaded extensionform factory在为了考虑到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)  
} 

最后,添加一个Entity Type模拟到您的preloaded extension

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())); 
} 

但是,你可能需要...

嘲笑registryDoctrineType调用它的默认构造函数时,因为它使用的setDefaultOptions()需要的参数(请记住,EntityType延伸DoctrineType)考虑您的Entity fieldclassproperty选项。

你可能会需要嘲笑的EntityType如下:

$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

你好,我跟着你发布的,但是,我得到一个错误:调用受保护的Doctrine \ ORM \ EntityManager :: __构造()从上下文'PHPUnit_Framework_MockObject_Generator'在/ usr/share/php/PHPUnit/Framework/MockObject/Generator。 php 237行 – skonsoft 2013-12-23 19:57:46

+0

@Ahmed Siouani你能否回答上述评论 – 2016-12-28 14:58:29

+0

我收到与@skonsoft相同的错误。你能告诉我们可能的解决方案吗? – 2017-01-10 06:10:28

0

艾哈迈德Siouani的答案是很好创作的,让我懂得如何在TypeTestCase添加Extension

但是,如果你想打一个一体化的测试,谁是不是在这种情况下一个单元测试更简单,你可以做如下:

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

由于本文档中介绍:http://symfony.com/doc/current/cookbook/form/unit_testing.html#adding-a-type-your-form-depends-on

相关问题