具有约束的Symfony2单元测试表单

pfw*_*fwd 5 php forms unit-testing symfony

我有一个没有连接到实体的表单,但确实有这里提到的约束:http://symfony.com/doc/current/book/forms.html#adding-validation

ContactBundle\Tests\Form\Type\TestedTypeTest :: testSubmitValidData Symfony\Component\OptionsResolver\Exception\InvalidOptionsException:选项"constraints"不存在.已知选项包括:"action","attr","auto_initialize","block_name","by_reference","compound","data","data_class","disabled","empty_data","error_bubbling","inherit_data" ","label","label_attr","mapped","max_length","method","pattern","post_max_size_message","property_path","read_only","required","translation_domain","trim", "虚拟"

以下是表单的一部分:

class ContactType extends AbstractType
{

/**
 * Build the form
 * @param \Symfony\Component\Form\FormBuilderInterface $builder BuilderInterface
 * @param array $aOption Array of options
 */
public function buildForm(FormBuilderInterface $builder, array $aOption)
{
    ///..
    $builder->add('name', 'text', array(
                'constraints' => array(
                    new NotBlank(),
                    new Length(array('min' => 3)),
                ),
            ))
            ->add('address', 'textarea', array(
                'required' => false
            ))
            //..
            ;
    //..
Run Code Online (Sandbox Code Playgroud)

这是单元测试

class TestedTypeTest extends TypeTestCase
{

public function testSubmitValidData()
{
    $formData = array(
        'name' => 'Test Name',
        'address' => '',
    );
    $type = new ContactType();
    $form = $this->factory->create($type, $formData);
    $form->submit($formData);

    $this->assertTrue($form->isSynchronized());

    $view = $form->createView();
    $children = $view->children;

    foreach (array_keys($formData) as $key) {
        $this->assertArrayHasKey($key, $children);
    }
}
}
Run Code Online (Sandbox Code Playgroud)

我猜测这是测试的问题而不是表单,因为表单按预期工作.我不确定我应该改变什么.任何帮助或建议都会很方便

谢谢

Rob*_*Rob 6

我认为问题在于您还将 formData 传递给工厂的 create 方法。

$form->submit($formData)像代码中已有的那样传递表单数据应该没问题

更多文档:http : //symfony.com/doc/current/cookbook/form/unit_testing.html

编辑:

好吧,似乎您必须在测试设置中将验证器/containt 扩展添加到工厂对象,如此处所述http://symfony.com/doc/current/cookbook/form/unit_testing.html#adding-custom-extensions


pfw*_*fwd 5

是的Rob是对的,我需要添加验证器/约束扩展.像这样:

 class TestedTypeTest extends TypeTestCase
 {

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

    $validator = $this->getMock('\Symfony\Component\Validator\Validator\ValidatorInterface');
    $validator->method('validate')->will($this->returnValue(new ConstraintViolationList()));
    $formTypeExtension = new FormTypeValidatorExtension($validator);
    $coreExtension = new CoreExtension();

    $this->factory = Forms::createFormFactoryBuilder()
            ->addExtensions($this->getExtensions())
            ->addExtension($coreExtension)
            ->addTypeExtension($formTypeExtension)
            ->getFormFactory();
}
//..
Run Code Online (Sandbox Code Playgroud)