消息“在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调”

IT技术 javascript automated-tests jestjs puppeteer
2021-02-23 16:39:26

我正在使用 Puppeteer 和 Jest 来运行一些前端测试。

我的测试如下:

describe("Profile Tab Exists and Clickable: /settings/user", () => {
    test(`Assert that you can click the profile tab`, async () => {
      await page.waitForSelector(PROFILE.TAB);
      await page.click(PROFILE.TAB);
    }, 30000);
});

有时,当我运行测试时,一切都按预期进行。其他时候,我收到一个错误:

超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调。

     at node_modules/jest-jasmine2/build/queue_runner.js:68:21 <br/>
     at Timeout.callback [as _onTimeout] (node_modules/jsdom/lib/jsdom/browser/Window.js:633:19)

这很奇怪,因为:

  1. 我将超时指定为 30000

  2. 我是否收到此错误似乎非常随机

为什么会这样?

6个回答

您在此处指定的超时时间需要短于默认超时时间。

默认的超时时间是5000,默认情况下框架jasmine中的情况jest您可以通过添加在测试中指定超时

jest.setTimeout(30000);

但这将特定于测试。或者您可以为框架设置配置文件。

配置 Jest

// jest.config.js
module.exports = {
  // setupTestFrameworkScriptFile has been deprecated in
  // favor of setupFilesAfterEnv in jest 24
  setupFilesAfterEnv: ['./jest.setup.js']
}

// jest.setup.js
jest.setTimeout(30000)

另请参阅这些主题:

每次测试设置超时 #5055

使 jasmine.DEFAULT_TIMEOUT_INTERVAL 可配置 #652

PS:拼写错误setupFilesAfterEnv(即setupFileAfterEnv)也会抛出同样的错误。

我也发现jest.setTimeout(10000)可以将其添加到边缘情况的单个测试中,因此不需要更改整个配置:)
2021-04-26 16:39:26
感谢您回答我无法通过 Jest 文档轻松找到的问题。
2021-04-27 16:39:26
在我的情况下,只有投入对我jest.setTimeOut(10000)describe帮助。既没有将它放在测试函数体中,也没有将超时指定为测试参数it.only(nm, fn, 10000)
2021-05-14 16:39:26
由于这对我有帮助,可能值得注意的是setupTestFrameworkScriptFile已被替换为setupFilesAfterEnv,因此它变为setupFilesAfterEnv: ["./jest.setup.js"]
2021-05-15 16:39:26
我应该错过一些东西,但如果我添加jest.setTimeout(30000);jest.config.js我会得到“ReferenceError: jest is not defined”。我试图添加const jest = require("jest");但后来我得到“TypeError: jest.setTimeout is not a function”。
2021-05-20 16:39:26

它应该async/await在它与测试异步时调用

describe("Profile Tab Exists and Clickable: /settings/user", () => {
    test(`Assert that you can click the profile tab`, async (done) => {
        await page.waitForSelector(PROFILE.TAB);
        await page.click(PROFILE.TAB);
        done();
    }, 30000);
});
这不是与现在原始问题中的代码相同吗?
2021-04-23 16:39:26
done回调中存在参数(在本例中命名)导致 Jest 等待直到调用此参数。即使不使用它,它的存在也很重要。
2021-04-29 16:39:26
为什么我们应该有done一个异步函数?我们不是简单地返回 Promise 或 undefined 吗?
2021-05-01 16:39:26
谢谢大家,我已经删除了done不需要回调。
2021-05-06 16:39:26
不,这不正确。您不需要调用 done() ,因为您正在等待您的Promise,或者您可以直接返回page.clickdone() 至少在我的情况下主要用于测试回调。
2021-05-18 16:39:26

随着 Jest 的发展,这个问题的答案已经改变。当前答案(2019 年 3 月):

  1. 您可以通过将第三个参数添加到it. IE,it('runs slow', () => {...}, 9999)

  2. 您可以使用 更改默认值jest.setTimeout去做这个:

    // Configuration
    "setupFilesAfterEnv": [  // NOT setupFiles
        "./src/jest/defaultTimeout.js"
    ],
    

    // File: src/jest/defaultTimeout.js
    /* Global jest */
    jest.setTimeout(1000)
    
  3. 就像其他人指出的那样,并且与此没有直接关系,done异步/等待方法没有必要。

这是更现代的版本
2021-04-27 16:39:26
让我们对此进行投票以将其推上阶梯......这是最好的答案!
2021-04-30 16:39:26

这是一个相对较新的更新,但它更直接。如果您使用的是 Jest 24.9.0 或更高版本,您可以添加testTimeout到您的配置中:

// in jest.config.js
module.exports = {
  testTimeout: 30000
}
我希望这是公认的答案,比将此配置放在单独的文件中要简单得多。
2021-04-24 16:39:26
这就像一个魅力,也jest.setTimeout因为它自己的线路不起作用。
2021-05-03 16:39:26
要生效,请确保再次“开玩笑 --watch”,如果它已经在运行。
2021-05-08 16:39:26

我想补充一点(评论有点长)即使3000我的测试超时,有时(随机)仍然会失败

超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调。

感谢Tarun 的精彩回答,我认为修复大量测试的最短方法是:

describe('Puppeteer tests', () => {
  beforeEach(() => {
    jest.setTimeout(10000);
  });

  test('Best Jest test fest', async () => {
    // Blah
  });
});
您不需要调用jest.setTimeout()inside beforeEach,对所有测试调用一次就足够了。
2021-05-07 16:39:26