【问题标题】:How to use Mocha with Promises/ES6 generators?如何将 Mocha 与 Promises/ES6 生成器一起使用?
【发布时间】:2016-09-24 15:42:36
【问题描述】:

我想将Mocha 与ES6 generators 一起使用,并可选择与expect 一起使用。经过一番研究,我构建了以下代码sn-p:

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

【问题讨论】:

  • 如果Service.validate() 是基于promise 的并且只在co 包装器中使用,那么问题涉及promise,而不是生成器。
  • 更新了标题...

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • expect(...).to.be.rejectedWith 和 expect(...).to.throw 都需要一个构造函数作为它们的第一个参数。在您的代码中,您传递 Error 实例而不是传递构造函数。 (见here 和here。)
【解决方案2】:

co 返回一个 Promise,其中抛出的错误会变成被拒绝的 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 时,它​​会返回一个promise,可以将它返回给Mocha,以便它知道测试何时结束。

【讨论】:

    猜你喜欢
    • 2016-02-01
    • 2017-02-21
    • 2016-10-14
    • 1970-01-01
    • 2016-05-18
    • 2018-10-27
    • 1970-01-01
    • 2015-01-07
    • 2021-08-15
    相关资源
    最近更新 更多