使用promises中的catch进行断言超过了超时

时间:2016-08-05 06:46:51

标签: javascript unit-testing assert es6-promise

我想在promise链的catch块中进行断言,但它会达到超时。断言在then块中有效,但似乎在catch块中,done()永远不会到达。它被抑制了吗?是否有更好的方法来测试承诺拒绝?

import assert from 'assert';
import { apicall } from '../lib/remoteapi';

describe('API calls', function () {
  it('should test remote api calls', function (done) {
    apicall([])
      .then((data) => {
        assert.equal(data.items.length, 2); // this works fine
        done();
      })
      .catch((e) => {
        console.log('e', e);
        assert.equal(e, 'empty array'); // ? 
        done(); // not reached?
      });
  });
});

承诺拒绝

apicall(channelIds) {
  if(channelIds.length === 0) return Promise.reject('empty array');

  ...        

}

我收到此错误:

Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.

1 个答案:

答案 0 :(得分:1)

如果这是mocha并且您正在使用Promises,请不要使用回调功能;当你发现它时,它会使事情变得非常尴尬。相反,mocha允许您返回测试中的承诺。被拒绝的Promise意味着失败的测试,而成功的Promise意味着成功的测试。断言失败会导致代码抛出异常,这将自动失败Promise,这通常是您想要的。简而言之:

describe('API calls', function () {
  it('should test remote api calls', function () {
    return apicall([])
      .then((data) => {
        assert.equal(data.items.length, 2);
      });
  });
});