我如何正确地testing摩卡和柴的承诺?
下面的testingperformance得很奇怪:
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); }) });
我应该如何妥善处理被拒绝的承诺(并testing)?
我应该如何正确处理一个失败的testing(即: expect(data.rate).to.have.length(400);
这是我正在testing的实现:
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 }); };
最简单的做法是使用摩卡在最近的版本中支持的内置承诺:
it('Should return the exchange rates for btc_ltc', function() { // no done var pair = 'btc_ltc'; // note the return return shapeshift.getRate(pair).then(function(data){ expect(data.pair).to.equal(pair); expect(data.rate).to.have.length(400); });// no catch, it'll figure it out since the promise is rejected });
由于这种方法是端到端的承诺,所以testing起来更容易,而且您不必考虑您正在考虑的奇怪情况,比如到处都是奇怪的done()
调用。
摩卡已经超越了像茉莉花这样的其他图书馆。 你可能也想检查一下Chai As Promised ,这会让它变得更容易(不.then
但是我个人更喜欢当前版本的清晰和简单
正如在这里已经指出的,摩卡的更新版本已经承诺了。 但是由于OP特别提到了Chai,所以指出chai-as-promised
包提供了一个干净的语法来testing承诺是公平的:
使用柴作为承诺
以下是如何使用chai-as-promised来testingPromise的resolve
和reject
案例:
var chai = require('chai'); var expect = chai.expect; var chaiAsPromised = require("chai-as-promised"); chai.use(chaiAsPromised); ... it('resolves as promised', function() { return expect(Promise.resolve('woof')).to.eventually.equal('woof'); }); it('rejects as promised', function() { return expect(Promise.reject('caw')).to.be.rejectedWith('caw'); });
没有答应答应
为了弄清楚什么是testing,这里是没有chai-as-promised编码的例子:
it('resolves as promised', function() { return Promise.resolve("woof") .then(function(m) { expect(m).to.equal('woof'); }) .catch(function(m) { throw new Error('was not supposed to fail'); }) ; }); it('rejects as promised', function() { return Promise.reject("caw") .then(function(m) { throw new Error('was not supposed to succeed'); }) .catch(function(m) { expect(m).to.equal('caw'); }) ; });