Symfony2 Tests fonctionnels: obtenir le token pour une requête ajaxSymfony2 Functional Test: get the token for an ajax request

J’ai eu énormément de mal a trouver un moyen de connaître le token CSRF de mon formulaire pour effectuer (lors de tests fonctionnels) une requête ‘ajax’.

$crawler = $this->client->request(
 'POST',
 $url,
 array(
   'element_add' => array(
      '_token' => '?????',
      'name'   => 'bla bla'
   ),
    array(),
    array('HTTP_X-Requested-With' => 'XMLHttpRequest')
  );

En effet dans ce code il nous manque le token de protection CSRF. Dans le soucis de ne pas modifier le code du logiciel pour permettre l’exécution du test j’ai cherché un moyen de connaître ce token dans mon test.

Ce ne fut pas une mince affaire. Après avoir cherché une méthode ou un moyen de récupérer ce token d’une manière prévu a cet effet, un utilisateur (Beryllium, merci encore) sur le chat de symfony (freenode, #symfony) m’a conseillé de regarder du coté du crawler.

Au bout du compte j’ai tout simplement récupérer le token .. dans la réponse de la première requête car le formulaire en question s’y trouve, et donc le token aussi.

$extract = $this->crawler->filter('input[name="element_add[_token]"]')
   ->extract(array('value'));
$csrf_token = $extract[0];

I had difficultys to find a way for know the CSRF token in my tests when i test an ajax request (functional test).

$crawler = $this->client->request(
 'POST',
 $url,
 array(
   'element_add' => array(
      '_token' => '?????',
      'name'   => 'bla bla'
   ),
    array(),
    array('HTTP_X-Requested-With' => 'XMLHttpRequest')
  );

In this code the CSRF is unknow. My condition was: Don’t modify the code for tests. So i search a way to find it in the test. I find a way: Beryllium, an user on the symfony tchat (freenode, #symfony) advise me to search in the crawler side.

So we have to take the csrf in the request response (dom):

$extract = $this->crawler->filter('input[name="element_add[_token]"]')
   ->extract(array('value'));
$csrf_token = $extract[0];

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *