3

我有一个事件处理函数,它接受一些事件数据和一个回调函数作为输入。

这个事件处理程序使用一个承诺来完成它的工作:

function myHandler(event, callback) {
  somePromise(event).then((result) => {
    if (result.Error) {
      callback(error);
    } else {
      callback(null, result.SuccessData);
    }
  });
}

我有以下代码来测试处理程序:

it('test handler', function(done) {
  let event = {...};
  myHandler(event, function(error, success) {
    expect(success).to.not.be.null;
    expect(error).to.be.null;
    expect(success.member).to.be.equal('expected');
    done();
  }
});

运行此测试时,我收到此错误:

(node:3508) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): AssertionError: expected 'unexpected' to equal 'expected'

和所有测试的结束:

Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

但是测试仍然通过...

为什么调用函数时会出现此错误done()

4

2 回答 2

2

将您的测试包装成一个 Promise,如果断言失败,该 Promise 将被拒绝。

it('test handler', () => {
  let event = {...}
  return new Promise((resolve, reject) => {
    myHandler(event, (error, success) => {
      try {
        expect(success).to.not.be.null;
        expect(error).to.be.null;
        expect(success.member).to.be.equal('expected');
        resolve();
      } catch (err) {
        reject(err);
      }
    });
  });
});
于 2018-03-09T20:04:27.130 回答
1

你正在使用 Promise。您可以在不使用的情况下返回您的 Promise done,如下所示:

// Note the absence of the done callback here
it('test handler', function() {
  let event = {...};
  return myHandler(event, function(error, success) {
    expect(success).to.not.be.null;
    expect(error).to.be.null;
    expect(success.member).to.be.equal('expected');
  }
});

或使用Chai As Promised

it('test handler', function(done) {
  let event = {...};
  myHandler(event, function(error, success) {
    expect(success).to.not.be.null;
    expect(error).to.be.null;
    expect(success.member).to.be.equal('expected');
  }.should.notify(done)
});

后者对我来说似乎更好,就好像您忘记了return第一个示例中的一样,您的测试可能会默默地失败。

于 2018-03-07T11:59:44.073 回答