【问题标题】:mocha async/await test failed with timeoutmocha async/await 测试因超时而失败
【发布时间】:2022-01-11 20:58:10
【问题描述】:

我想用Mocha 测试异步代码。

我遵循了本教程testing-promises-with-mocha。最后,它说最好的方法是异步/等待。

以下是我的代码,我打算将 setTimeout 设置为比 Mocha 默认值更长。

describe('features', () => {
  it('assertion success', async() => {
    const resolvingPromise = new Promise( resolve => {
      setTimeout(() => {
        resolve('promise resolved')
      }, 3000)
    })

    const result = await resolvingPromise
    expect(result).to.equal('promise resolved')
  })
})

Mocha 给我的错误如下:

Error: Timeout of 2000ms exceeded. For async tests and hooks, 
ensure "done()" is called; if returning a Promise, ensure it resolves...

如何解决错误?简单设置mocha --timeout 10000更长?

感谢您的宝贵时间!

Mocha: 5.2.0
Chai: 4.2.0

【问题讨论】:

    标签: async-await mocha.js


    【解决方案1】:

    正如你提到的, --timeout 标志可以完成这项工作。

    node ./node_modules/mocha/bin/mocha --timeout <milliseconds>

    如果您想在整个项目中设置默认超时,也可以检查:Change default timeout for mocha

    【讨论】:

      【解决方案2】:

      对于异步测试,您应该调用 done() 回调。

      describe('features', () => {
        it('assertion success', async(done) => { // pass done here
          const resolvingPromise = new Promise( resolve => {
            setTimeout(() => {
              resolve('promise resolved')
            }, 3000)
          })
      
          const result = await resolvingPromise
          expect(result).to.equal('promise resolved')
          done() // invoke at end
        })
      })
      

      【讨论】:

      【解决方案3】:

      Mocha 有超时控制。 Mocha docs

      语法是:

      it('should take less than 500ms', function(done) {
        this.timeout(5000); // 5 seconds
        setTimeout(done, 3000);
      });
      

      你的例子:

      describe('features', () => {
        it('assertion success', async (done) => {
          this.timeout(5000);
          const resolvingPromise = new Promise(resolve => {
            setTimeout(() => resolve('promise resolved'), 3000)
          });
      
          const result = await resolvingPromise();
          expect(result).to.equal('promise resolved');
          done();
        });
      });
      

      【讨论】:

      • 但有些步骤确实需要很长时间才能完成。给他们一个很大的超时时间不是很好吗?
      • 这只会改变测试超时。 done() 添加到测试的末尾。您的意思是某些步骤只是计算复杂且冗长,还是您正在测试发出 API/网络请求的代码?如果您正在测试包含需要很长时间的步骤的代码,则增加超时是最佳选择。如果测试代码发出外部请求,那么这些 API/网络请求应该被存根。如果您正在测试本身具有长计时器的代码,请使用类似 sinon 或类似的库来模拟和控制系统计时器,以便您手动控制滴答声。
      • 感谢德鲁里斯提供的信息!我正在做后端测试。我们的开发服务器在谷歌云中。所以基本上我需要向远程服务器发送请求。我不想在测试中嘲笑。有些请求真的很长才能响应。我想按照建议将done() 添加到某处来避免此错误。因为我认为调整超时不是最好的方法?或者在这种情况下,我只需要增加超时时间?
      • 您需要扩展默认计时器并将 done 添加到您的异步测试中,即如果默认的 2000 毫秒计时器过早地使您的测试失败。
      猜你喜欢
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 2018-06-13
      相关资源
      最近更新 更多