使用动态生成字段的表单测试控制器

时间:2017-12-27 19:14:21

标签: php ajax symfony testing phpunit

我有一个包含动态字段的表单:

<div></div>

我在ajax中有这段代码:

<div class="container">
  <div>
    <div class="welcome">Welcome to Happy Heidi's</div>
    <div class="header">
      <h1>Vintage Fiesta Pottery for Sale</h1></div>
  </div>
  ...
</div>

事实上,根据GroupeCompetence,能力是动态产生的。

我想在PHPUnit中测试它。

我试过了:

<?php

namespace AppBundle\Form;

//uses ...
class AnnonceType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
        ->add('titre')
        ->add('description')
        ->add('groupeCompetence', EntityType::class, [
            'class'       => 'AppBundle\Entity\GroupeCompetences',
            'choice_label' => 'nom',
            'placeholder' => 'Sélectionnez votre type de service',
            ])
        ->add('prix')
        ->add('serviceADistance')
        ->add('ajouter', SubmitType::class);


        $formModifier = function (FormInterface $form, GroupeCompetences $groupeCompetences=null){
            $competences = null === $groupeCompetences ? array() : $groupeCompetences->getCompetences();

            $form->add('competence', EntityType::class, array(
                'class' => 'AppBundle\Entity\Competence',
                'choice_label' => 'nom',
                'placeholder' => 'Choisir une compétence',
                'choices' => $competences,
                ));
        };

        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $event) use ($formModifier) {

                // this would be your entity, i.e. CompetenceChoisie
                $data = $event->getData();

                //var_dump($data);
                //die();

                $formModifier($event->getForm(), $data->getGroupeCompetence());
            }
            );

         $builder->get('groupeCompetence')->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $event) use ($formModifier) {

                $groupeCompetences = $event->getForm()->getData();

                $formModifier($event->getForm()->getParent(), $groupeCompetences);

            }
            );

    } 
}

问题在于: $ form [&#39; requete_prestataire [能力]&#39;] 正如我所说的那样动态生成。

我希望能够在测试中执行ajax请求,然后测试输出。

我该怎么办?

提前致谢

1 个答案:

答案 0 :(得分:0)

我找到了解决方案:

您必须禁用验证,并在生成时发送表单:

$crawler = $this->client->request('GET', '/');

        $form = $crawler->selectButton('requete_prestataire_Rechercher')->form();
        $form['requete_prestataire[groupeCompetence]'] = 2;
        $form['requete_prestataire[competence]']->disableValidation()->select(50);

        $crawler = $this->client->submit($form);