Forms Symfony2:TypeTestCase的意图

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

由于我最近3次尝试实现TypeTestCase都失败了,我开始怀疑TypeTestCases的意图,就像在本文中描述的那样

最后一个失败,错误如下

  • 无法加载类型“实体”
  • “无效消息”选项不存在。已知的选项是:“a[…]
  • 选项“约束”不存在。已知选项为:“ac[…]
像前两个错误一样的错误让我怀疑拥有TypeTestCase的想法是否还没有真正完成

所以我想知道的是,如何最有效地测试自定义表单类型。(如以下表格)

MyTypeTestCase

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