单元测试自定义 Symfony 表单类型

sen*_*ett 5 php unit-testing symfony-forms symfony

我想对自定义的验证进行单元测试FormTypeInterface

我有一个自定义表单类型设置如下:

class HiddenFieldType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', 'text', [
            'constraints' => [
                new NotBlank([
                    'message' => 'hiddenfield-invalid'
                ])
            ]
        ]);
    }

    public function getName()
    {
        return 'hiddenfield';
    }
}
Run Code Online (Sandbox Code Playgroud)

我想通过实例化表单对象来测试约束是否成立。从Symfony 文档中,我想出了这个:

public function testValidation()
{
    $formData = [
        'name' => null // blank value
    ];

    $hiddenFieldType = new HiddenFieldType();
    $form = $this->factory->create($hiddenFieldType);

    // submit the data to the form directly
    $form->submit($formData);

    var_dump($form->isValid()); die;
}

// factory is set up as per http://stackoverflow.com/a/27035802/614523
protected function setUp()
{

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

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

我目前的理解告诉我$form->isValid()应该返回false这里(这是它在控制器和文档中的使用方式但只要包含字符串$form->isValid()就总是返回。true$formData['name']

我还尝试使用对象传递数据use Symfony\Component\HttpFoundation\Request

public function testValidation($userInput, $isValid)
{
    $formData = [
        'name' => 'asdasd'
    ];

    $hiddenFieldType = new HiddenFieldType();
    $form = $this->factory->create($hiddenFieldType);

    // submit the data to the form using the request object
    $request = new Request($getParams = [], $postParams = $formData);
    $form->handleRequest($request);

    var_dump($form->isValid()); die;
}
Run Code Online (Sandbox Code Playgroud)

当我这样做时,总是返回 false,只要is 不为 null 且不是空字符串,$form->isValid()我就希望它返回 false 。true$formData['name']

我究竟做错了什么?