Модули тестирования Symfony2 с ограничениями

У меня есть форма, которая не связана с сущностью, но имеет ограничения, как указано здесь: http://symfony.com/doc/current/book/forms.html#adding-validation

ContactBundle \ Tests \ Form \ Type \ TestedTypeTest :: testSubmitValidData Symfony \ Component \ OptionsResolver \ Exception \ InvalidOptionsException: опции "ограничений" не существует. Известны следующие варианты: «действие», «attr», «auto_initialize», «block_name», «by_reference», «составные», «данные», «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 )) //.. ; //.. 

Вот единичный тест

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

Я предполагаю, что это проблема с тестом вместо формы, поскольку форма работает так, как ожидалось. Я не уверен, что я должен изменить. Любая помощь или совет будут удобны

благодаря

Я думаю, проблема заключается в том, что вы также передаете formData методу создания фабрики.

Должно быть хорошо просто передать данные формы через $form->submit($formData) как у вас уже есть в вашем коде

Дополнительные документы: http://symfony.com/doc/current/cookbook/form/unit_testing.html

РЕДАКТИРОВАТЬ:

Ну, похоже, вам нужно добавить расширения validator / constaint к заводскому объекту в вашей тестовой настройке, как указано здесь http://symfony.com/doc/current/cookbook/form/unit_testing.html#adding-custom-extensions

Да, Роб был прав, мне нужно было добавить расширения валидатора / ограничения. Вот так:

  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(); } //.. 

Я предлагаю вам переопределить метод TypeTestCase :: getExtensions ()

 use Symfony\Component\Form\Extension\Core\CoreExtension; use Symfony\Component\Form\Extension\Core\Type\FormType; use Symfony\Component\Form\Extension\Validator\ValidatorExtension; use Symfony\Component\Form\Form; use Symfony\Component\Translation\IdentityTranslator; use Symfony\Component\Validator\ConstraintValidatorFactory; use Symfony\Component\Validator\Context\ExecutionContextFactory; use Symfony\Component\Validator\Mapping\ClassMetadata; use Symfony\Component\Validator\Mapping\Factory\MetadataFactoryInterface; use Symfony\Component\Validator\Tests\Fixtures\FakeMetadataFactory; use Symfony\Component\Validator\Validator\RecursiveValidator; .... public function getExtensions() { $extensions = parent::getExtensions(); $metadataFactory = new FakeMetadataFactory(); $metadataFactory->addMetadata(new ClassMetadata( Form::class)); $validator = $this->createValidator($metadataFactory); $extensions[] = new CoreExtension(); $extensions[] = new ValidatorExtension($validator); return $extensions; } 

добавьте метод createValidator () в свой тестовый класс:

  protected function createValidator(MetadataFactoryInterface $metadataFactory, array $objectInitializers = array()) { $translator = new IdentityTranslator(); $translator->setLocale('en'); $contextFactory = new ExecutionContextFactory($translator); $validatorFactory = new ConstraintValidatorFactory(); return new RecursiveValidator($contextFactory, $metadataFactory, $validatorFactory, $objectInitializers); } 

Не нужно переопределять TypeTestCase :: getTypeExtensions (), потому что класс ValidatorExtension уже имеет метод loadTypeExtensions ().

Тогда ваш тестовый метод может выглядеть следующим образом:

 public function testSubmitValidData() { $formData = array( 'name' => 'Test Name', 'address' => '', ); $form = $this->factory->create(ContactType::class); $form->submit($formData); $this->assertTrue($form->isValid()); $this->assertTrue($form->isSynchronized()); $view = $form->createView(); $children = $view->children; foreach (array_keys($formData) as $key) { $this->assertArrayHasKey($key, $children); } } 

Вы можете проверить недействительные данные:

 public function testSubmitInvalidValidData() { $formData = array( 'name' => 'T', ); $form = $this->factory->create(ContactType::class); $form->submit($formData); $this->assertFalse($form->isValid()); $this->assertFalse($view->children['name']->vars['valid']); } 

источники: