【问题标题】:How to handle async test in Mocha?如何在 Mocha 中处理异步测试?
【发布时间】:2018-08-15 09:44:01
【问题描述】:

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

这个事件处理程序正在使用一个 Promise 来完成它的工作:

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()函数时会出现这个错误?

【问题讨论】:

    标签: node.js mocha-phantomjs


    【解决方案1】:

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

    // 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,你的测试可能会默默地失败。

    【讨论】:

    • 由于myHandler 不是承诺,不幸的是,返回是行不通的。我可以尝试 Chai As Promised,但如果测试的方法不是承诺,它会起作用吗?
    【解决方案2】:

    将您的测试包装成一个承诺,如果断言失败则拒绝。

    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);
          }
        });
      });
    });
    

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 2018-09-03
      • 2012-09-29
      • 2014-02-08
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      相关资源
      最近更新 更多