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
包装中使用,那么问题涉及承诺,而不是生成器。更新了标题…If
Service.validate()
是基于承诺的,并且只在
co
包装器中使用,然后问题涉及承诺,而不是生成器。更新了标题…
expect(…).to.be.rejected with
expect(…).to.throw
都需要构造函数作为其第一个参数。在这里的代码中,您传递
Error
实例,而不是传递构造函数。(请参见和。)
expect(…).to.be.rejectedWith
expect(…).to.throw
都需要构造函数作为其第一个参数。在这里的代码中,您传递
Error
实例,而不是传递构造函数。(见和。)