在Mocha测试中使用done和setTimeout的简单示例未按预期工作

时间:2019-02-19 19:39:35

标签: javascript testing mocha

我有一个简单的测试,其中包含一个包含在setTimeout函数中的断言,如下所示:

  it('asserts after timeout', (done) => {
    setTimeout(() => {
      expect(1).to.be.equal(1);
      done();
    }, 500);
  });

但是我遇到以下错误:

  

错误:超时超过2000毫秒。对于异步测试和挂钩,请确保   称为“ done()”;如果返回了Promise,请确保它可以解决。

2 个答案:

答案 0 :(得分:1)

猛跳过去,查看了代码库中的每个单元测试之后,我意识到有一个对sinon.useFakeTimers()的调用。删除该问题已解决。

答案 1 :(得分:0)

您的示例应该起作用。但是,当期望失败时,您将得到该错误。为此,请将setTimeout包裹在Promise中,并确保在下一个then方法中调用done

之所以认为bad practice是因为将done方法放在要测试的区域中。

it('asserts after timeout', (done) => {
    (new Promise((resolve,reject)=>{
       setTimeout(() => {
         resolve();
       }, 500);
    }))
    .then(()=>expect(1).to.be.equal(1))
    .then(()=>done(), done);
});