Le test suivant se comporte bizarrement:
it('Should return the exchange rates for btc_ltc', function(done) {
var pair = 'btc_ltc';
shapeshift.getRate(pair)
.then(function(data){
expect(data.pair).to.equal(pair);
expect(data.rate).to.have.length(400);
done();
})
.catch(function(err){
//this should really be `.catch` for a failed request, but
//instead it looks like chai is picking this up when a test fails
done(err);
})
});
Comment dois-je gérer correctement une promesse rejetée (et la tester)?
Comment dois-je gérer correctement un test échoué (par exemple expect(data.rate).to.have.length(400);
:?
Voici l'implémentation que je teste:
var requestp = require('request-promise');
var shapeshift = module.exports = {};
var url = 'http://shapeshift.io';
shapeshift.getRate = function(pair){
return requestp({
url: url + '/rate/' + pair,
json: true
});
};
Ensure the done() callback is being called in this test
erreur en essayant de faire cela avec mocha 2.2.5.done
paramètre dans leit
qui le désirerait.done
dans monit
rappel et appeler explicitementreturn
(sur la promesse) dans le rappel est la façon dont je l'ai fait fonctionner, tout comme dans l'extrait de code.Alternately, instead of using the done() callback, you may return a Promise. This is useful if the APIs you are testing return promises instead of taking callbacks:
done
paramètre à l'it
appel, et cela se produit toujours ...Comme déjà souligné ici , les nouvelles versions de Mocha sont déjà compatibles avec Promise. Mais comme l'OP a posé des questions spécifiquement sur Chai, il est juste de souligner le
chai-as-promised
paquet qui fournit une syntaxe propre pour tester les promesses:en utilisant chai-comme-promis
Voici comment vous pouvez utiliser chai-as-promise pour tester les deux
resolve
et lesreject
cas pour une promesse:sans chai-comme-promis
Pour être vraiment clair sur ce qui est testé, voici le même exemple codé sans chai-as-promise:
la source
catch
est invoquée lorsque l'un desexpect(s)
échecs. Cela donne une fausse impression que la promesse a échoué même si ce n'est pas le cas. Ce n'est que l'attente qui a échoué.Chai.use
pour le monter. Je n'avais jamais repris cela dans la documentation dont ils disposaient. | :(Voici ma prise:
async/await
Une fonction de promesse retardée, qui échoue, si un délai de 0 est donné:
Le test positif est assez simple. Un échec inattendu (simuler par
500→0
) échouera automatiquement au test, car la promesse rejetée s'intensifie.Le test négatif utilise l'idée try-catch. Cependant: «se plaindre» d'une passe indésirable ne se produit qu'après la clause catch (de cette façon, cela ne finit pas dans la clause catch (), déclenchant d'autres erreurs mais trompeuses.
Pour que cette stratégie fonctionne, il faut renvoyer le test à partir de la clause catch. Si vous ne voulez rien tester d'autre, utilisez un autre bloc it () -.
la source
Thre est une meilleure solution. Renvoyez simplement l'erreur avec done dans un bloc catch.
ce test échouera avec le message suivant:
AssertionError: expected 1 to equal 11
la source