J'ai des problèmes pour obtenir Chai expect.to.throw
travaille dans un test pour mon application node.js. Le test continue d'échouer sur l'erreur levée, mais si j'encapsule le cas de test pour essayer d'attraper et d'affirmer l'erreur capturée, cela fonctionne.
Ne expect.to.throw
fonctionne pas comme je pense que cela devrait ou quelque chose?
it('should throw an error if you try to get an undefined property', function (done) {
var params = { a: 'test', b: 'test', c: 'test' };
var model = new TestModel(MOCK_REQUEST, params);
// neither of these work
expect(model.get('z')).to.throw('Property does not exist in model schema.');
expect(model.get('z')).to.throw(new Error('Property does not exist in model schema.'));
// this works
try {
model.get('z');
}
catch(err) {
expect(err).to.eql(new Error('Property does not exist in model schema.'));
}
done();
});
L'échec:
19 passing (25ms)
1 failing
1) Model Base should throw an error if you try to get an undefined property:
Error: Property does not exist in model schema.
la source
model
l'instance a une fonction appelée get que j'ai passée / appelée dans expect.to.throw
consiste à tester une condition particulière dans une fonction, ce qui nécessite d'appeler cette fonction avec l'état / les arguments non valides. (D'ailleurs ... pourquoi les liens profonds de chaijs.com ne sont-ils pas réellement des liens profonds?)Comme le dit cette réponse , vous pouvez également simplement envelopper votre code dans une fonction anonyme comme celle-ci:
la source
expect(function(){ model.get('z'); }).to.throw('Property does not exist in model schema.').notify(done);
car il n'y a pas de méthode de notification.catch (err) { expect(err).equal('Error message to be checked'); done(); }
this
intérieur de la fonction à appeler. C'est alors.bind
la bonne façon de procéder.Et si vous utilisez déjà ES6 / ES2015, vous pouvez également utiliser une fonction de flèche. C'est essentiellement la même chose que d'utiliser une fonction anonyme normale mais plus courte.
la source
this
this
de la portée dans laquelle elles ont été créées. Souvent, cela peut être un avantage, car cela évite d'avoir àbind
insérerthis
manuellement des fonctions dans leur objet.bind
et toujours lié àthis
l'étendue parent. Mon intention dans le commentaire était seulement de m'assurer que les lecteurs étaient au courant d'une chute potentielle.Cette question a de nombreux doublons, y compris des questions ne mentionnant pas la bibliothèque d'assertions Chai. Voici les bases rassemblées ensemble:
L'assertion doit appeler la fonction, au lieu de l'évaluer immédiatement.
Vous pouvez rechercher des erreurs spécifiques à l'aide de n'importe quelle bibliothèque d'assertions:
Nœud
Devrait
Chai Expect
Vous devez gérer les exceptions qui «échappent» au test
Cela peut sembler déroutant au premier abord. Comme faire du vélo, il clique pour toujours une fois qu'il clique.
la source
exemples de doc ...;)
parce que vous comptez sur le
this
contexte:vous devez utiliser l'une de ces options:
lier le contexte
la source
Une autre implémentation possible, plus lourde que la solution .bind (), mais qui aide à faire valoir que expect () nécessite une fonction qui fournit un
this
contexte à la fonction couverte, vous pouvez utiliser uncall()
, par exemple,expect(function() {model.get.call(model, 'z');}).to.throw('...');
la source
J'ai trouvé un bon moyen de le contourner:
C'est beaucoup plus lisible que mon ancienne version:
la source