103 votes

Test pour les erreurs lancées dans Mocha

J'espère trouver de l'aide pour résoudre ce problème. J'essaie d'écrire des tests pour une application que je suis en train d'écrire. J'ai résumé le problème dans l'exemple de code suivant. Je veux tester qu'une erreur a été déclenchée. J'utilise Testacular comme exécuteur de tests avec mocha comme framework et chai comme bibliothèque d'assertion. Les tests s'exécutent, mais le test échoue parce qu'une erreur est survenue ! Toute aide est la bienvenue !

function iThrowError() {
    throw new Error("Error thrown");
}

var assert = chai.assert,
    expect = chai.expect;
describe('The app', function() {
    describe('this feature', function() {
        it("is a function", function(){
            assert.throw(iThrowError(), Error, "Error thrown");
        });
    });
});

151voto

red Points 1095

Vous ne passez pas votre fonction à assert.throws() de la bonne manière.

Le site assert.throws() attend une fonction comme premier paramètre. Dans votre code, vous invoquez iThrowError et passez sa valeur de retour lorsque vous appelez la fonction assert.throws() .

En gros, changer ça :

assert.throws(iThrowError(), Error, "Error thrown");

à ça :

assert.throws(iThrowError, Error, "Error thrown");

devrait résoudre votre problème.

Avec args :

assert.throws(() => { iThrowError(args) }, Error);

ou

assert.throws(function() { iThrowError(args) }, Error, /Error thrown/);

42voto

Jake Points 2102

Ajouter à la meilleure réponse Si vous devez invoquer votre fonction dans le cadre du test (c'est-à-dire que votre fonction ne doit déclencher une erreur que si certains paramètres sont transmis), vous pouvez intégrer votre appel de fonction dans une fonction anonyme ou, dans ES6+, vous pouvez transmettre votre fonction dans une expression de fonction fléchée.

// Function invoked with parameter.
// TEST FAILS. DO NOT USE.
assert.throws(iThrowError(badParam), Error, "Error thrown"); // WRONG!

// Function invoked with parameter; wrapped in anonymous function for test.
// TEST PASSES.
assert.throws(function () { iThrowError(badParam) }, Error, "Error thrown");

// Function invoked with parameter, passed as predicate of ES6 arrow function.
// TEST PASSES.
assert.throws(() => iThrowError(badParam), Error, "Error thrown");

Et, par souci d'exhaustivité, voici une version plus littérale :

// Explicit throw statement as parameter. (This isn't even valid JavaScript.)
// TEST SUITE WILL FAIL TO LOAD. DO NOT USE, EVER.
assert.throws(throw new Error("Error thrown"), Error, "Error thrown"); // VERY WRONG!

// Explicit throw statement wrapped in anonymous function.
// TEST PASSES.
assert.throws(function () { throw new Error("Error thrown") }, Error, "Error thrown");

// ES6 function. (You still need the brackets around the throw statement.)
// TEST PASSES.
assert.throws(() => { throw new Error("Error thrown") }, Error, "Error thrown");

26voto

Vincent Simard Points 524

J'ai vu que vous avez pu résoudre votre problème mais que vous n'avez pas pu vérifier une erreur spécifique. Pour le faire en utilisant la syntaxe expect/should de Chai, vous pouvez utiliser les paramètres des différentes signatures de jeter() :

@param{ ErrorConstructor } constructor
@param{ String | RegExp } expectederror message
@param{ String } message _optional_

Dans votre exemple, vous devriez pouvoir utiliser l'un ou l'autre des éléments suivants :

expect(iThrowError).to.throw(/Error thrown/);
expect(iThrowError).to.throw(Error, /Error thrown/);
expect(iThrowError).to.throw(new Error('Error thrown'));

Et (encore une fois, d'après la documentation de chai), vous pourriez filtrer d'autres messages d'erreur en utilisant :

expect(iThrowError).to.throw(Error).and.not.throw(/Another Error thrown/);

J'espère que cela vous aidera !

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