mercredi 23 septembre 2015

Unit testing custom Symfony Form Types

I want to unit test the validation on a custom FormTypeInterface.

I have a custom Form Type set up like this:

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

I want to test that the constraint holds by instantiating the form object. From the Symfony documentation, I have come up with this:

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://ift.tt/1gNmgJG
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();
}

My current understanding tells me that $form->isValid() should return false here (this is how it is used in the controller and in the documentation, but $form->isValid() always returns true as long as $formData['name'] contains a string.

I have also tried passing the data using a use Symfony\Component\HttpFoundation\Request object:

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

When I do this $form->isValid() always returns false, where I would expect it to be true whenever $formData['name'] is not null and not an empty string.

What am I doing wrong?

Aucun commentaire:

Enregistrer un commentaire