如何使用Mocha with Promises / ES6生成器?

我想用ES6 generators使用Mocha ,也可以随意使用。 经过一番研究,我构build了以下代码片段:

 describe('test', function() { it('should not work', function() { expect(function() { return co(function*() { yield Service.validate(); }); }).to.throw(new Error('error')); }); }); 

Service.validate抛出new Error('error') ,这就是我所expect

 module.exports = { validate: function() { return co(function*() { // use yield to access db and so on throw new Error('error'); }); } }; 

但是,下面的代码抛出AssertionError: expected [Function] to throw 'Error: error' 。 谁能帮忙?

co返回一个承诺,并在其中抛出的错误将被转化为被拒绝的承诺。 所以你必须testing一个被拒绝的Promise,而不是一个例外。 此代码工作:

 var chai = require("chai"); var chaiAsPromised = require("chai-as-promised"); var co = require("co"); var expect = chai.expect; chai.use(chaiAsPromised); // Register chai-as-promised with Chai. describe('test', function() { it('should not work', function() { return expect(co(function*() { throw new Error("testing failure!"); })).to.be.rejectedWith(Error, "testing failure!"); }); }); 

请注意这是如何return expect(...) 。 当你testingexpect的承诺,它返回一个承诺,可以返回到摩卡,以便它可以知道什么时候testing结束。

chai-as-promised可以和co一起使用。 co返回一个承诺,所以应该相应地处理:

 expect(co(function*() { ... })).to.be.rejectedWith(Error, 'error'); 

如果代码不是co的,并且发电机没有产生许诺,发电机yield可以直接testing:

 expect(() => (function* () { ... })().next()).to.throw(Error, 'error'); 

或者,可以使用chai-generator来代替to.yield断言。