Forms Symfony2:TypeTestCase的意图
由于我最近3次尝试实现TypeTestCase都失败了,我开始怀疑TypeTestCases的意图,就像在本文中描述的那样 最后一个失败,错误如下Forms Symfony2:TypeTestCase的意图,forms,unit-testing,symfony,testing,symfony-forms,Forms,Unit Testing,Symfony,Testing,Symfony Forms,由于我最近3次尝试实现TypeTestCase都失败了,我开始怀疑TypeTestCases的意图,就像在本文中描述的那样 最后一个失败,错误如下 无法加载类型“实体” “无效消息”选项不存在。已知的选项是:“a[…] 选项“约束”不存在。已知选项为:“ac[…] 像前两个错误一样的错误让我怀疑拥有TypeTestCase的想法是否还没有真正完成 所以我想知道的是,如何最有效地测试自定义表单类型。(如以下表格) MyTypeTestCase: namespace Acme\UserBundl
- 无法加载类型“实体”
- “无效消息”选项不存在。已知的选项是:“a[…]
- 选项“约束”不存在。已知选项为:“ac[…]
namespace Acme\UserBundle\Form;
use Acme\UserBundle\Entity\Legalform;
use Acme\UserBundle\Entity\User;
use Acme\UserBundle\Form\Type\RegistrationFormType;
use Symfony\Bridge\Doctrine\Tests\DoctrineOrmTestCase;
use Symfony\Component\Form\Test\TypeTestCase;
class RegistrationFormTypeTest extends TypeTestCase
{
public function testSubmitValidData()
{
$formData = array(
'companyLegalForm' => $this->getLegalformFake(),
'salutation' => 'Herr',
'password' => array(
'first' => 'esellese14',
'second' => 'esellese14'
)
);
$query = $this->getMockBuilder('Doctrine\ORM\AbstractQuery')
->disableOriginalConstructor()
->getMockForAbstractClass();
$query->expects($this->once())
->method('execute')
->will($this->returnValue(array($this->getLegalformFake())));
$queryBuilder = $this->getMockBuilder('Doctrine\ORM\QueryBuilder')
->disableOriginalConstructor()
->getMock();
$queryBuilder->expects($this->once())
->method('getQuery')
->will($this->returnValue($query));
$legalformRepository = $this->getMockBuilder('Acme\UserBundle\Repository\LegalformRepository')
->disableOriginalConstructor()
->getMock();
$legalformRepository->expects($this->once())
->method('getQueryBuilderForRegistration')
->with(1)
->will($this->returnValue($queryBuilder));
$type = new RegistrationFormType('Acme\UserBundle\Entity\User', $legalformRepository);
$form = $this->factory->create($type);
$object = new User();
$object->fromArray($formData);
// submit the data to the form directly
$form->submit($formData);
$this->assertTrue($form->isSynchronized());
$this->assertEquals($object, $form->getData());
$view = $form->createView();
$children = $view->children;
foreach (array_keys($formData) as $key) {
$this->assertArrayHasKey($key, $children);
}
}
/**
* @return Legalform
*/
private function getLegalformFake()
{
$legalform = new Legalform();
$legalform->setId(1);
$legalform->setTitle('wuff');
return $legalform;
}
}
我现在的解决方案是编写一个带有断言的公共单元测试,断言所有表单字段都正确调用了$builder->add()。有什么想法吗?谢谢你纠正了打字错误,但是回答呢?:-)你找到解决这个问题的办法了吗?在基于DoctrineODM/DocumentTypeNope测试自定义表单类型时遇到类似问题:正如我所写的“我现在的解决方案是编写一个带有断言的公共单元测试,即$builder->add()已正确地为我的所有表单字段调用。”。。。但很快我将在Symfony2研讨会上与sensiolabs的一位成员谈论这一点。
namespace Acme\UserBundle\Form;
use Acme\UserBundle\Entity\Legalform;
use Acme\UserBundle\Entity\User;
use Acme\UserBundle\Form\Type\RegistrationFormType;
use Symfony\Bridge\Doctrine\Tests\DoctrineOrmTestCase;
use Symfony\Component\Form\Test\TypeTestCase;
class RegistrationFormTypeTest extends TypeTestCase
{
public function testSubmitValidData()
{
$formData = array(
'companyLegalForm' => $this->getLegalformFake(),
'salutation' => 'Herr',
'password' => array(
'first' => 'esellese14',
'second' => 'esellese14'
)
);
$query = $this->getMockBuilder('Doctrine\ORM\AbstractQuery')
->disableOriginalConstructor()
->getMockForAbstractClass();
$query->expects($this->once())
->method('execute')
->will($this->returnValue(array($this->getLegalformFake())));
$queryBuilder = $this->getMockBuilder('Doctrine\ORM\QueryBuilder')
->disableOriginalConstructor()
->getMock();
$queryBuilder->expects($this->once())
->method('getQuery')
->will($this->returnValue($query));
$legalformRepository = $this->getMockBuilder('Acme\UserBundle\Repository\LegalformRepository')
->disableOriginalConstructor()
->getMock();
$legalformRepository->expects($this->once())
->method('getQueryBuilderForRegistration')
->with(1)
->will($this->returnValue($queryBuilder));
$type = new RegistrationFormType('Acme\UserBundle\Entity\User', $legalformRepository);
$form = $this->factory->create($type);
$object = new User();
$object->fromArray($formData);
// submit the data to the form directly
$form->submit($formData);
$this->assertTrue($form->isSynchronized());
$this->assertEquals($object, $form->getData());
$view = $form->createView();
$children = $view->children;
foreach (array_keys($formData) as $key) {
$this->assertArrayHasKey($key, $children);
}
}
/**
* @return Legalform
*/
private function getLegalformFake()
{
$legalform = new Legalform();
$legalform->setId(1);
$legalform->setTitle('wuff');
return $legalform;
}
}