我如何正确地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的resolvereject案例:

 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'); }) ; });