web-dev-qa-db-fra.com

Test d'erreurs 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 j'écris. J'ai distillé le problème dans l'exemple de code suivant. Je veux tester qu'une erreur a été lancée. J'utilise Testacular en tant que testeur avec mocha en tant que framework et chai en tant que bibliothèque d'assertions. Les tests sont exécutés, mais le test échoue car une erreur a été générée! Toute aide est grandement appréciée!

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");
        });
    });
});
70
Chris Neitzer

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

La fonction assert.throws() attend une fonction en tant que premier paramètre. Dans votre code, vous appelez iThrowError et transmettez sa valeur de retour lorsque vous appelez assert.throws().

En gros, changer ceci:

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

pour ça:

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

devrait résoudre votre problème.

107
red

En ajoutant la réponse du haut , si vous devez appeler votre fonction dans le cadre du test (c’est-à-dire que votre fonction ne doit émettre une erreur que si certains paramètres sont passés), vous pouvez envelopper votre appel de fonction de manière anonyme. fonction ou, dans ES6 +, vous pouvez transmettre votre fonction dans une expression de fonction de flèche.

// 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, pour des raisons de minutie, 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");
28
Jake

J'ai vu que vous pouviez résoudre votre problème, mais que vous ne pouviez pas rechercher une erreur spécifique. Pour ce faire, en utilisant la syntaxe expect/should de Chai, vous pouvez utiliser les paramètres des différentes signatures de throw () :

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

Dans votre exemple, vous devriez pouvoir utiliser l’un 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, à partir de la documentation de chai), vous pouvez filtrer d'autres messages d'erreur en utilisant:

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

J'espère que cela t'aides!

19
Vincent Simard