Javascript 如何将摩卡与Promises/ES6发电机一起使用?
我想将Javascript 如何将摩卡与Promises/ES6发电机一起使用?,javascript,node.js,ecmascript-6,mocha.js,chai,Javascript,Node.js,Ecmascript 6,Mocha.js,Chai,我想将Mocha与ES6生成器一起使用,也可以选择使用expect。经过一些研究,我构建了以下代码片段: describe('test', function() { it('should not work', function() { expect(function() { return co(function*() { yield Service.validate(); }); }).to.throw(new Error('error')); }); }
Mocha
与ES6生成器一起使用
,也可以选择使用expect
。经过一些研究,我构建了以下代码片段:
describe('test', function() {
it('should not work', function() {
expect(function() {
return co(function*() {
yield Service.validate();
});
}).to.throw(new Error('error'));
});
});
Service.validate抛出新的错误('Error'),这就是我所期望的
module.exports = {
validate: function() {
return co(function*() {
// use yield to access db and so on
throw new Error('error');
});
}
};
但是,下面的代码抛出断言错误:预期[Function]抛出“Error:Error”。有人能帮忙吗?
co
返回一个承诺,其中抛出的错误将变成拒绝的承诺。所以你必须测试一个被拒绝的承诺,而不是一个例外。此代码适用于:
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!");
});
});
请注意,
如何返回expect(…)
。当您使用expect
测试承诺时,它会返回一个承诺,该承诺可以返回给摩卡,以便它知道测试何时结束。co
返回一个承诺,其中抛出的错误将变为拒绝的承诺。所以你必须测试一个被拒绝的承诺,而不是一个例外。此代码适用于:
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!");
});
});
请注意,如何返回expect(…)
。当您使用expect
测试承诺时,它会返回一个承诺,可以返回给摩卡,以便它知道测试何时结束。可以与co
一起使用co
返回一个承诺,因此应该相应地处理它:
expect(co(function*() { ... })).to.be.rejectedWith(Error, 'error');
如果代码不是基于co的,并且生成器没有产生承诺,那么可以直接测试生成器:
expect(() => (function* () { ... })().next()).to.throw(Error, 'error');
或者,可以用于to.yield
断言。可以与co
结合使用co
返回一个承诺,因此应该相应地处理它:
expect(co(function*() { ... })).to.be.rejectedWith(Error, 'error');
如果代码不是基于co的,并且生成器没有产生承诺,那么可以直接测试生成器:
expect(() => (function* () { ... })().next()).to.throw(Error, 'error');
或者,可以用于
to.yield
断言。如果Service.validate()
是基于承诺的,并且只在co
包装中使用,那么问题涉及承诺,而不是生成器。更新了标题…IfService.validate()
是基于承诺的,并且只在co
包装器中使用,然后问题涉及承诺,而不是生成器。更新了标题…expect(…).to.be.rejected with
和expect(…).to.throw
都需要构造函数作为其第一个参数。在这里的代码中,您传递Error
实例,而不是传递构造函数。(请参见和。)expect(…).to.be.rejectedWith
和expect(…).to.throw
都需要构造函数作为其第一个参数。在这里的代码中,您传递Error
实例,而不是传递构造函数。(见和。)