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

时间:2016-05-26 14:46:25

标签: javascript node.js ecmascript-6 mocha chai

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

2 个答案:

答案 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断言。