449 votes

Comment tester le type d'exception levée en Jest ?

Je travaille avec un code où j'ai besoin de tester le type d'exception lancé par la fonction (Est-ce TypeError, ReferenceError etc.).

Mon cadre de test actuel est AVA et je peux le tester en tant que second argument. t.throws comme ici :

it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', (t) => {
  const error = t.throws(() => {
    throwError();
  }, TypeError);

  t.is(error.message, 'UNKNOWN ERROR');
});

J'ai commencé à réécrire mes tests en Jest et je n'ai pas trouvé comment le faire facilement. Est-ce possible ?

635voto

PeterDanis Points 1220

En Jest, vous devez passer une fonction dans expect(function).toThrow(blank ou type d'erreur).

Exemple :

test("Test description", () => {
  const t = () => {
    throw new TypeError();
  };
  expect(t).toThrow(TypeError);
});

Si vous avez besoin de tester une fonction existante pour savoir si elle se lance avec un ensemble d'arguments, vous devez l'envelopper dans une fonction anonyme dans expect().

Exemple :

test("Test description", () => {
  expect(() => {http.get(yourUrl, yourCallbackFn)}).toThrow(TypeError);
});

175voto

bodolsog Points 992

C'est un peu bizarre, mais ça fonctionne et je pense que c'est bien lisible :

it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', () => {
  try {
      throwError();
      // Fail test if above expression doesn't throw anything.
      expect(true).toBe(false);
  } catch (e) {
      expect(e.message).toBe("UNKNOWN ERROR");
  }
});

Catch attrape l'exception, vous pouvez alors effectuer un test sur l'exception créée. Error . Étrange expect(true).toBe(false); est nécessaire pour faire échouer votre test si l'on attend Error ne seront pas lancées. Sinon, cette ligne n'est jamais accessible ( Error devrait être soulevée devant eux).

127voto

Tal Joffe Points 1450

J'utilise une version légèrement plus concise :

expect(() => {
  //code block that should throw error
}).toThrow(TypeError) //or .toThrow('expectedErrorMessage')

13voto

Andrei CACIO Points 1695

Je n'ai pas essayé moi-même, mais je suggérerais d'utiliser la méthode de Jest toThrow l'affirmation. Donc je suppose que votre exemple ressemblerait à quelque chose comme ça :

it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', (t) => {
  const error = t.throws(() => {
    throwError();
  }, TypeError);

  expect(t).toThrowError('UNKNOWN ERROR');
  //or
  expect(t).toThrowError(TypeError);
});

Encore une fois, je ne l'ai pas testé mais je pense que cela devrait fonctionner.

Faites-moi savoir si cela vous a aidé.

Bon codage !

11voto

Alexander Points 3287

Jest dispose d'une méthode toThrow(error) pour vérifier qu'une fonction est lancée lorsqu'elle est appelée.

Donc, dans votre cas, vous devriez l'appeler ainsi :

expect(t).toThrowError(TypeError);

Les docs

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X