Comment tester une fonction qui devrait générer une erreur dans Jest ?

Avec le framework Jest, vous pouvez tester vos applications développées sur un serveur Node.js. Ces tests peuvent prendre en charge aussi bien une application développée en JavaScript pur qu'avec des librairies comme Babel, ou des frameworks comme React ou Angular. Jest fournit un grand nombre de fonctions pour tester un code. On peut même tester une fonction alors que l'on sait qu'elle va générer une erreur.

Pour tester une fonction dont vous savez qu'elle va produire une erreur, vous devez l'encapsuler dans une variable. La fonction "expects()" prend en paramètre la variable contenant la fonction et analyse son comportement. Elle retourne une promesse. Utilisez ensuite la méthode "toThrow()" pour analyser l'exception générée. Cette méthode prend en paramètre un type d'erreur et vous indique si l'exception générée par la fonction est bien de ce type. Elle peut également prendre en paramètre un message d'erreur, et vérifier si le message envoyé par la fonction est bien celui-ci.

test("Test de ma fonction", () => {
  const t = () => {
    maFonctionATester();
  };
  expect(t).toThrow(TypeError);
  expect(t).toThrow("UNKNOWN ERROR");
});

Vous pouvez également utiliser une autre méthode pour vérifier l'erreur générée par votre fonction. Il suffit de l'encapsuler dans un bloc "try/catch". Dans le bloc catch, utilisez la méthode "toBe()" sur le message ou le type de l'exception pour vérifier qu'il s'agit bien du message attendu. Vous devez par contre, pour bien paramétrer votre test, contrôler que la fonction génère une erreur. La fonction "expect.assertions()" prend en paramètre le nombre d'erreurs attendues dans votre test. Avec cette directive, le test échouera si la fonction testée ne renvoie pas d'erreur.

it('Test de ma fonction', () => {
  //On attend qu'une erreur se produise
  expect.assertions(1);
  try {
      throwError();
  } catch (e) {
      expect(e).toBeInstanceOf(TypeError);
      expect(e.message).toBe("UNKNOWN ERROR");
  }
});

JavaScript