如何使用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
断言。