2017-12-27 24 views
1

I有し動的フィールド持つフォーム:テストdynamicly生成されたフィールドを有するフォームをコントローラ

<?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は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> 

、力量をGroupeCompetenceに応じて動的に生成されます。

これをPHPUnitでテストしたいと思います。

私はこれを試してみました:

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


    } 

問題があることである:私が言ったように$フォーム[ 'requete_prestataire [能力]']がdynamicly生成されます。

私はテストでajaxリクエストを行い、出力をテストしたいと考えています。

どうすればいいですか?事前

答えて

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); 
関連する問題