我想将Mocha
与ES6 generators
一起使用,并可选择与expect
一起使用。经过一些研究,我构建了以下代码片段:
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'
。有人可以帮忙吗?
答案 0 :(得分:3)
co
返回一个promise,其中抛出的错误将被转换为被拒绝的Promises。因此,您必须测试被拒绝的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(...)
。当您使用expect
测试promise时,它会返回一个promise,可以将其返回给Mocha,以便它可以知道测试何时结束。
答案 1 :(得分:1)
chai-as-promised可与co
结合使用。 co
返回一个承诺,因此应该相应地处理:
expect(co(function*() { ... })).to.be.rejectedWith(Error, 'error');
如果代码不是基于co
,并且生成器没有产生承诺,则可以直接测试生成器yield
:
expect(() => (function* () { ... })().next()).to.throw(Error, 'error');
或者,可以使用chai-generator代替to.yield
断言。