如何将 Mocha 与 Promises/ES6 生成器一起使用?

How to use Mocha with Promises/ES6 generators?

我想将 MochaES6 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'。有人可以帮忙吗?

co returns 一个promise,里面抛出的错误会变成rejected Promise。因此,您必须测试被拒绝的 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 时,它​​ returns 一个 promise,它可以返回给 Mocha,这样它就可以知道测试何时结束。

chai-as-promised可与co结合使用。 co returns 一个承诺,所以应该相应地处理:

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

如果代码不是基于 co,并且生成器不产生承诺,则可以直接测试生成器 yield

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

或者,chai-generator 可用于 to.yield 断言。