【问题标题】:Jest setTimeout not pausing test开玩笑 setTimeout 没有暂停测试
【发布时间】:2018-02-15 01:26:45
【问题描述】:
it('has working hooks', async () => {
  setTimeout(() => {
    console.log("Why don't I run?")
    expect(true).toBe(true)
  }, 15000)

我已经查看了这个答案、Jest 文档和几个 GitHub 线程:

Disable Jest setTimeout mock

目前,超时内的函数没有运行。 如何让 Jest 暂停执行测试 15 秒,然后运行内部函数?

谢谢!

【问题讨论】:

    标签: javascript testing timer jestjs


    【解决方案1】:

    一种很好且干净的方法(无需回调),我们可以简单地运行await 并将res 传递给setTimeout(res, XXX),如下所示:

    it('works with await Promise and setTimeout', async () => {
      // await 15000ms before continuing further
      await new Promise(res => setTimeout(res, 15000));
    
      // run your test
      expect(true).toBe(true)
    });
    

    【讨论】:

      【解决方案2】:

      setTimeout 现在可通过 jest 对象使用,它会按您的预期运行:https://jestjs.io/docs/jest-object#misc

      it('works with jest.setTimeout', async () => {
        // pause test example for 15 seconds
        jest.setTimeout(15000)
      
        // run your test
        expect(true).toBe(true)
      });
      

      注意:如果您尝试在没有 jest 对象的情况下将超时设置为 5000 毫秒或更长时间,jest 将出错并让您知道改用 jest.setTimeout。

      【讨论】:

      • 这不会暂停当前的测试功能。 jest.setTimeout 定义了测试函数完成的最长时间。默认为 5 秒,如果需要更长的时间,开玩笑的测试功能将失败。您可以轻松地证明,如果您“添加 await new Promise(res => setTimeout(res, 15000));”到您的测试功能。
      【解决方案3】:
      it('has working hooks', async () => {
        await new Promise(res => setTimeout(() => {
          console.log("Why don't I run?")
          expect(true).toBe(true)
          res()
        }, 15000))
      })
      

      it('has working hooks', done => {
        setTimeout(() => {
          console.log("Why don't I run?")
          expect(true).toBe(true)
          done()
        }, 15000)
      })
      

      【讨论】:

      • 谢谢!很抱歉批准晚了。大学发生了。您能否提供更多关于为什么会这样以及我的代码错误的解释?另外,如果有人对上述问题有疑问,请尝试将超时时间从 15000 降低,因为它超过了测试框架中的内置最大值。
      • 在你的代码中,你没有传递done参数,所以jest会一直运行到结束,虽然你有async,但是你没有任何await持有代码。我可以回答,第一个使用asyncawait,第二个使用done,两者都将保存代码。我希望我能解释一下。
      • 在完成之前使用 expect 只会让它对我来说运行不明确。有什么想法吗?
      • 我猜你在 node.js 中使用 jest。这种情况下需要设置testEnvironment为node,勾选facebook.github.io/jest/docs/en/…
      • 使用 done() 在我的情况下会导致 eslint 错误,所以我采用了第一种方法。感谢这两种方法。
      猜你喜欢
      • 2017-11-28
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 2020-02-06
      • 2020-03-25
      • 1970-01-01
      相关资源
      最近更新 更多