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

Javascript 在mocha测试中使用done和setTimeout的简单示例未按预期工作,javascript,testing,mocha.js,Javascript,Testing,Mocha.js,我有一个简单的测试,其中一个断言包含在setTimeout函数中,如下所示: it('asserts after timeout', (done) => { setTimeout(() => { expect(1).to.be.equal(1); done(); }, 500); }); 但是,我得到了以下错误: 错误:超过2000毫秒的超时时间。对于异步测试和挂钩,请确保 调用“done()”;如果返回承诺,请确保它已解决 你的例子

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

  it('asserts after timeout', (done) => {
    setTimeout(() => {
      expect(1).to.be.equal(1);
      done();
    }, 500);
  });
但是,我得到了以下错误:

错误:超过2000毫秒的超时时间。对于异步测试和挂钩,请确保 调用“done()”;如果返回承诺,请确保它已解决


你的例子应该有用。然而,当期望失败时,您将得到该错误。为此,请将
setTimeout
包装在
Promise
中,并确保在下一个then方法中调用
done

因此,将
done
方法与您正在测试的方法放在同一区域被认为是不好的做法

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

在仔细研究代码库中的每个单元测试之后,我意识到有一个对sinon.useFakeTimers()的调用;删除该选项修复了此问题。

可能您需要一个try catch,并在catch中放入done()。。整个页面/应用程序的超时时间可能为2000。。