Je travaille avec du code dans lequel je dois tester le type d'exception lancée par la fonction (Is it TypeError, ReferenceError etc.).
Mon cadre de test actuel est AVA et je peux le tester en tant que deuxième t.throws
méthode d' argument , 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 sur Jest et je n'ai pas trouvé comment le faire facilement. Est-ce même possible?
la source
expect('here').not.toBe('here');
juste pour le plaisir :-)expect('to be').not.toBe('to be')
dans le style Shakespeare.J'utilise une version un peu plus concise:
la source
D'après mon exposition (bien que limitée) à Jest, j'ai trouvé que cela
expect().toThrow()
convient si vous voulez UNIQUEMENT tester une erreur d'un type spécifique:expect(() => functionUnderTest()).toThrow(TypeError);
OU une erreur est générée avec un message spécifique:
expect(() => functionUnderTest()).toThrow('Something bad happened!');
Si vous essayez de faire les deux, vous obtiendrez un faux positif. Par exemple, si votre code lance
RangeError('Something bad happened!')
, ce test passera:expect(() => functionUnderTest()).toThrow(new TypeError('Something bad happened!'));
La réponse de bodolsog qui suggère d'utiliser un try / catch est proche, mais plutôt que de s'attendre à ce que true soit faux pour s'assurer que les assertions attendues dans la capture sont atteintes, vous pouvez à la place utiliser
expect.assertions(2)
au début de votre test où2
est le nombre d'assertions attendues . Je pense que cela décrit plus précisément l'intention du test.Exemple complet de test du type AND message d'une erreur:
Si
functionUnderTest()
ne lance PAS d'erreur, les assertions seront frappées mais leexpect.assertions(2)
échouera et le test échouera.la source
expect.hasAssertions()
pourrait être une meilleure alternative lorsque le test n'a pas d'assertions à l'extérieurcatch
, car vous n'avez pas à mettre à jour le nombre si vous ajoutez / supprimez des assertions.Je n'ai pas essayé moi-même mais je suggérerais d'utiliser l' assertion toThrow de Jest . Donc, je suppose que votre exemple ressemblerait à ceci:
Encore une fois, je ne l'ai pas testé mais je pense que cela devrait fonctionner.
la source
Jest a une méthode
toThrow(error)
pour tester qu'une fonction lève lorsqu'elle est appelée.Donc, dans votre cas, vous devriez l'appeler ainsi:
Les docs
la source
jest.spyOn(service, 'create').mockImplementation(() => { throw new Error(); });
si la méthode simuléecreate
ne l'est pasasync
.La plaisanterie moderne vous permet de faire plus de contrôles sur la valeur rejetée. Par exemple:
échouera avec une erreur
la source
La documentation explique clairement comment procéder. Disons que j'ai une fonction qui prend deux paramètres et elle lancera une erreur si l'un d'entre eux l'est
null
.Votre test
la source
Si vous travaillez avec
Promise
s:la source
J'ai fini par écrire une méthode pratique pour notre bibliothèque test-utils
la source
Suite à l'article de Peter Danis, je voulais juste souligner la partie de sa solution impliquant "[passer] une fonction dans expect (fonction) .toThrow (vide ou type d'erreur)".
Dans Jest, lorsque vous testez un cas où une erreur devrait être générée, dans votre wrapping expect () de la fonction en cours de test, vous devez fournir une couche de wrapping de fonction de flèche supplémentaire pour que cela fonctionne. C'est à dire
Mauvaise (mais l'approche logique de la plupart des gens):
Droite:
C'est très étrange mais cela devrait permettre de réussir le test.
la source
essayer
expect(t).rejects.toThrow()
la source
try
? il n'y a pas d'essayer - mais de répondre. Si c'est la réponse, veuillez donner plus de détails. qu'est-ce que vous ajoutez à la réponse existante?