J'essaie d'écrire un test pour Jasmine Test Framework qui attend une erreur. Pour le moment, j'utilise une intégration Jasmine Node.js de GitHub .
Dans mon module Node, j'ai le code suivant:
throw new Error("Parsing is not possible");
Maintenant, j'essaie d'écrire un test qui attend cette erreur:
describe('my suite...', function() {
[..]
it('should not parse foo', function() {
[..]
expect(parser.parse(raw)).toThrow(new Error("Parsing is not possible"));
});
});
J'ai également essayé Error()
et quelques autres variantes et je n'arrive pas à comprendre comment le faire fonctionner.
Function.bind
: stackoverflow.com/a/13233194/294855Réponses:
vous devez transmettre une fonction à l'
expect(...)
appel. Le code que vous avez ici:essaie d' appeler
parser.parse(raw)
pour tenter de transmettre le résultatexpect(...)
,Essayez plutôt d'utiliser une fonction anonyme:
la source
expect(parser.parse).toThrow(...)
expect(blah).toThrow()
. Aucun argument signifie vérifier pour voir qu'il jette du tout. Aucune correspondance de chaîne n'est requise. Voir aussi: stackoverflow.com/a/9525172/1804678parser.parse
utiliséthis
, le passer sans contexte produira des résultats inattendus. Vous pourriez passerparser.parse.bind(parser)
, mais honnêtement ... une fonction anonyme serait plus élégante.Vous utilisez:
Mais si vous regardez le commentaire de la fonction (la chaîne attendue est):
Je suppose que vous devriez probablement l'écrire comme ceci (en utilisant lambda - fonction anonyme):
Ceci est confirmé dans l'exemple suivant:
Douglas Crockford recommande fortement cette approche, au lieu d'utiliser "throw new Error ()" (façon de prototypage):
la source
Error
( jsfiddle.net/k1mxey8j ). Cependant, votre objet jeté n'aura bien sûr pas la.stack
propriété, ce qui peut être important si vous souhaitez configurer un rapport d'erreurs automatisé .Une solution plus élégante que de créer une fonction anonyme dont le seul but est d'en envelopper une autre est d'utiliser la
bind
fonction d'es5 . La fonction de liaison crée une nouvelle fonction qui, lorsqu'elle est appelée, a sonthis
mot clé défini sur la valeur fournie, avec une séquence donnée d'arguments précédant tout argument fourni lorsque la nouvelle fonction est appelée.Au lieu de:
expect(function () { parser.parse(raw, config); } ).toThrow("Parsing is not possible");
Considérer:
expect(parser.parse.bind(parser, raw, config)).toThrow("Parsing is not possible");
La syntaxe de liaison vous permet de tester des fonctions avec des
this
valeurs différentes et, à mon avis, rend le test plus lisible. Voir aussi: https://stackoverflow.com/a/13233194/1248889la source
Je remplace le match toThrow de Jasmine par ce qui suit, ce qui vous permet de faire correspondre la propriété de nom de l'exception ou sa propriété de message. Pour moi, cela rend les tests plus faciles à écrire et moins fragiles, car je peux faire ce qui suit:
puis testez avec les éléments suivants:
Cela me permet de modifier le message d'exception plus tard sans casser les tests, lorsque l'important est qu'il a levé le type d'exception attendu.
C'est le remplacement de toThrow qui permet ceci:
la source
expect(blah).toThrow()
. Aucun argument signifie vérifier pour voir qu'il jette du tout. Aucune correspondance de chaîne n'est requise. Voir aussi: stackoverflow.com/a/9525172/1804678Comme mentionné précédemment, une fonction doit être transmise
toThrow
car c'est la fonction que vous décrivez dans votre test: "Je m'attends à ce que cette fonction renvoie x"Si vous utilisez Jasmine-Matchers, vous pouvez également utiliser l'un des éléments suivants lorsqu'ils conviennent à la situation;
ou
la source
expect(foo).toThrowError(TypeError);
dans Jasmine 2.5: jasmine.github.io/2.5/introductionJe sais que c'est plus de code mais vous pouvez également faire:
la source
Pour les amateurs de coffeescript
la source
Pour tous ceux qui pourraient encore être confrontés à ce problème, pour moi, la solution publiée ne fonctionnait pas et elle continuait de générer cette erreur:
Error: Expected function to throw an exception.
j'ai réalisé plus tard que la fonction que je m'attendais à lancer une erreur était une fonction asynchrone et attendait une promesse de être rejeté puis lancer une erreur et c'est ce que je faisais dans mon code:et c'est ce que j'ai fait dans mon test et cela a fonctionné:
la source
expectAsync
jasmine.github.io/api/3.3/async-matchers.html