2017-12-27 5 views
1

Ich habe eine Form, die ein dynamisches Feld hat:Testing ist ein Controller mit einer Form, die ein Feld hat dynamicly erzeugt

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

      } 
      ); 

    } 
} 

Ich habe diesen 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 der Tat, Kompetenzen wird dynamisch abhängig von GroupeCompetence generiert.

Und ich möchte dies in PHPUnit testen. diese

Ich habe versucht:

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


    } 

Das Problem ist, dass: $ form [ 'requete_prestataire [Kompetenz]'] wird dynamicly erzeugt wie gesagt.

Ich möchte in der Lage sein, die Ajax-Anfrage im Test zu tun, und dann die Ausgabe zu testen.

Wie kann ich fortfahren?

Vielen Dank im Voraus

Antwort

0

fand ich die Lösung:

Sie Validierung zu deaktivieren haben, und senden Sie das Formular, wie es erzeugt wurde:

$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); 
Verwandte Themen