testing失败的承诺与摩卡的内置承诺支持

我应该怎样用摩卡和柴来testing我的诺言失败了?

我很困惑,因为我最初认为我应该使用'mocha-as-promised',但是这个包现在已经被弃用了(我正在使用mocha 2.1.0),build议只使用现在内置的promisevalidation摩卡。 请参阅: https : //github.com/domenic/mocha-as-promised

另一篇文章build议废除it()callback的“完成”参数 – 不知道为什么,因为我理解传入“done”参数是表示testing正在被asynchronoustesting的方式。 见: 我如何正确地testing摩卡和柴的承诺?

无论如何,我试图减less我的问题到下面的代码 – 请帮我修改这个,以便我可以testing我的承诺确实失败。

it.only("do something (negative test)", function (done) { var Q = require('q'); function makePromise() { var deferred = Q.defer(); deferred.reject(Error('fail')); return deferred.promise; }; makePromise() .then(done, done); }); 

一些更多的挖掘,看来正确的方法是添加一个额外的catch块,像这样…

 it.only("do something (negative test)", function (done) { var Q = require('q'); function makePromise() { var deferred = Q.defer(); deferred.reject(Error('fail')); return deferred.promise; }; makePromise() .catch(function(e) { expect(e.message).to.equal('fail'); }) .then(done, done); }); 

我对替代想法感兴趣,或确认这是好的方式..谢谢。

更新:

本 – 我现在说说你在说什么,尤其是。 在本杰明·G的简洁但有用的评论之后

总结:

当你传递一个done参数时,testing可以通过调用done()函数来触发它的“完成”。

当你不传入一个done参数时,它通常只适用于同步调用。 但是,如果您返回承诺,则摩卡框架(mocha> 1.18)将捕获通常会被吞噬的任何故障(按照承诺规范)。 这是一个更新的版本:

 it.only("standalone neg test for mocha+promises", function () { var Q = require('q'); function makePromise() { var deferred = Q.defer(); deferred.reject(Error('fail')); return deferred.promise; }; return makePromise() .catch(function(e) { expect(e.message).to.equal('fail'); }); }); 

您可以返回一个承诺,表明testing是asynchronous的:

 function something() { return Q.reject(Error('fail')); } it('should reject', function() { return something().then(function() { throw new Error('expected rejection'); }, function() { return 'passed :]'; }); }); 

chai-as-promised为Promises提供了一个干净的testing框架:

 $ npm install chai-as-promised 

在你的testing文件中:

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

这感觉干净,直观。 但是,如果没有这样的承诺,你可以完成类似的事情:

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