Tester une requête fetch

Afin de tester une requête fetch, il faut pouvoir tester du code asynchrone. Problème: lors de l'exécution normale, la fonction de test se termine avant que le code qui vérifie le retour de la requête s'exécute. Il est possible de demander à mocha d'avoir un comportement différent (voir la doc). Pour tester du code asynchrone, il faut:

  • ajouter un paramètre (ici done) à la fonction de test (ce paramètre est lui-même une fonction)
  • appeler cette fonction done sans arguments si le test s'est bien passé (il faut quand même appeler la fonction, donc on ajoute () )
  • appeler cette fonction avec une description de l'erreur en paramètre si le test échoue.

On peut par exemple procéder comme suit pour vérifier que le serveur lifap5 fonctionne:

suite("Test avec fetch et promesses", function() {
  test("Exemple de test sur une promesse de fetch", function(done){
    // Attention à la ligne au dessus, on a ajouté un paramètre done à la fonction de test
    fetch("https://lifap5.univ-lyon1.fr")
      .then(response => {
        chai.assert.equal(200,Number(response.status));
        done(); // Le test est terminé et a réussi
      })
      .catch(err => {
        done(err); // le test a échoué avec l'erreur err
      })

  });
  test("Exemple de test qui échoue à cause du code de retour", function(done){
    // Attention à la ligne au dessus, on a ajouté un paramètre done à la fonction de test
    fetch("https://lifap5.univ-lyon1.fr")
      .then(response => {
        chai.assert.equal(201,Number(response.status)); 
        // cette assertion va échouer car le serveur renvoie 200 et pas 201 ici
        done(); // Le test est terminé et a réussi si on arrive ici, 
        // mais comme l'assertion précédente échoue, cette ligne n'est jamais exécutée
      })
      .catch(err => {
        done(err); // le test a échoué avec l'erreur err
      })
  });
})

Remarque: si un assert échoue, une erreur est déclenchée, mais sera récupérée par le catch final.