在测试我的一些自定义类型时,我已经遇到了同样的问题。
这是我解决的方法(通过模拟 EntityType),
首先,确保您的测试类扩展 TypeTestCase,
class MyTypeTest extends TypeTestCase
{
// ...
}
然后,将preloaded extension 添加到您的form 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()));
}
但是,您可能需要...
模拟DoctrineType 在调用其默认构造函数时将其作为参数的registry,因为setDefaultOptions() 使用它(请记住EntityType 扩展DoctrineType)以考虑class 和@987654332 @你的Entity field的选项。
然后您可能需要按如下方式模拟 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'));