dongqin1861 2017-12-27 19:14
浏览 55
已采纳

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

I have a form which has a dynamic field :

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

            }
            );

    } 
}

I have this code in ajax :

<script>
  var $groupeCompetence = $('#requete_prestataire_groupeCompetence');
// When sport gets selected ...
$groupeCompetence.change(function() {
  // ... retrieve the corresponding form.
  var $form = $(this).closest('form');
  // Simulate form data, but only include the selected sport value.
  var data = {};
  data[$groupeCompetence.attr('name')] = $groupeCompetence.val();
  // Submit data via AJAX to the form's action path.
  $.ajax({
    url : $form.attr('action'),
    type: $form.attr('method'),
    data : data,
    success: function(html) {
      // Replace current position field ...
      $('#requete_prestataire_competence').replaceWith(
        // ... with the returned one from the AJAX response.
        $(html).find('#requete_prestataire_competence')
        );
      // Position field now displays the appropriate positions.
    }
  });
});
</script>

In fact, competences is generated dynamicly depending on GroupeCompetence.

And I want to test this in PHPUnit.

I tried this :

public function testIndexRechercheUtilisateurNonConnecte()
    {
        $crawler = $this->client->request('GET', '/');

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

        $crawler = $this->client->submit($form);
        $this->assertTrue($this->client->getResponse()->isRedirect());
        $client->followRedirect();

        /*$this->assertEquals(3, $crawler->filter('a [class = "btn-sm btn-primary"]')->count());*/


    }

The problem is that : $form['requete_prestataire[competence]'] is generated dynamicly as I said.

I want to be able to do the ajax request in the test, and then test the output.

How can I proceed ?

Thanks in advance

  • 写回答

1条回答 默认 最新

  • dongzhun4898 2017-12-28 18:19
    关注

    I found the solution :

    you have to disable validation, and send the form as it was generated :

    $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);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀