当使用Mocha / Chai测试异步函数时,未能匹配期望总是会导致超时

时间:2015-11-17 02:54:11

标签: javascript unit-testing asynchronous mocha chai

例如,我有类似这样的基本内容:

it.only('tests something', (done) => {
  const result = store.dispatch(fetchSomething());
  result.then((data) => {
    const shouldBe = 'hello';
    const current = store.something;
    expect(current).to.equal(shouldBe);
    done();
  }
});

currentshouldBe不匹配时,我会收到通用超时消息,而不是一条消息,说明它们不匹配:

  

错误:超过2000毫秒的超时。确保正在进行done()回调   在这个测试中调用。

好像期望是暂停脚本或其他东西。我该如何解决?这使调试几乎不可能。

1 个答案:

答案 0 :(得分:2)

期望不是暂停脚本,它在您点击done回调之前抛出异常,但由于它不再在测试方法的上下文中,因此它不会也被测试套件拿起,所以你永远不会完成测试。然后你的测试就会旋转,直到达到超时。

您需要在回调或Promise的错误处理程序中捕获异常。

it.only('tests something', (done) => {
  const result = store.dispatch(fetchSomething());
  result.then((data) => {
    const shouldBe = 'hello';
    const current = store.getState().get('something');
    try {
      expect(current).to.equal(shouldBe);
      done();
    } catch (e) {
      done(e);
    } 
  });
});

it.only('tests something', (done) => {
  const result = store.dispatch(fetchSomething());
  result.then((data) => {
    const shouldBe = 'hello';
    const current = store.getState().get('something');
    expect(current).to.equal(shouldBe);

  })
  .catch(done);
});

修改

如果您不反对引入另一个库,那么有一个相当不错的库调用chai-as-promised。这为您提供了一些很好的实用工具。