在jest.setTimeout指定的5000ms超时内未调用异步回调

时间:2018-04-02 00:34:44

标签: javascript automated-tests jestjs puppeteer

我使用木偶戏和玩笑来进行一些前端测试。

我的测试如下:

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);
});

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

Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.

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

这很奇怪,因为:

  1. 我指定超时为30000

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

  3. 任何人都可以猜到为什么会这样吗?

17 个答案:

答案 0 :(得分:105)

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

默认超时为5000,如果为jasmine,则默认情况下框架为jest。您可以通过添加

指定测试内的超时
jest.setTimeout(30000);

但这将是测试的具体内容。或者您可以为框架设置配置文件。

https://facebook.github.io/jest/docs/en/configuration.html#setuptestframeworkscriptfile-string

// jest.config.js
module.exports = {
  setupTestFrameworkScriptFile: './jest.setup.js'
}

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

还可以看到这个帖子

https://github.com/facebook/jest/issues/5055

https://github.com/facebook/jest/issues/652

答案 1 :(得分:31)

当它与测试异步时,应调用done函数。

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);
});

答案 2 :(得分:9)

我想补充一点(发表评论的时间有点长),即使超时3000,我的测试有时还是会(随机)失败,因为

Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.

由于@Tarun的出色回答,我认为修复许多测试的最短方法是:

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

  test('best jest test fest', async () => {
    // blah
  });
});

答案 3 :(得分:8)

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

  1. 您可以通过向<embed>添加第三个参数来覆盖任何单个测试的超时。即。 from datetime import date class Time: def __init__(self, date): self.time = date def age(self): today = date.today() date_this_year = date(today.year, self.time.month, self.time.day) return today.year - self.time.year - (date_this_year > today) time = Time(date(1994,4,12)) print(time.age())

  2. 您可以使用it更改默认设置。为此:

it('runs slow', () => {...}, 9999)

jest.setTimeout
  1. 就像其他人指出的那样,并且与之没有直接关系,使用异步/等待方法则不需要 // config "setupFilesAfterEnv": [ // NOT setupFiles "./src/jest/defaultTimeout.js" ],

答案 4 :(得分:8)

对于jest 24.9+,您还可以通过添加--testTimeout

从命令行设置超时

以下是其docs的摘录

--testTimeout=<number>
Default timeout of a test in milliseconds. Default value: 5000.

答案 5 :(得分:7)

确保在回调函数上调用done();,否则它不会简单地通过测试。

beforeAll((done /* call it or remove it*/) => {
  done(); // calling it
});

适用于所有具有done()回调的其他函数。

答案 6 :(得分:5)

另一个解决方案:在the jest config file中设置超时时间,例如:

{ // ... other stuff here
    "testTimeout": 90000
}

答案 7 :(得分:1)

对于Jest 24.9+ 我们只需要在命令行中添加--testTimeout

--testTimeout= 10000 // timeout of 10s

默认超时值为5000。 这将适用于所有测试用例。

或者如果您只想给特定功能超时,则可以在声明测试用例时使用此语法。

test(name, fn, timeout)

示例

test('example', async () => {
  

}, 10000); // timeout of 10s (default is 5000)

答案 8 :(得分:1)

当网络速度慢或使用await进行许多网络呼叫时,就会发生超时问题,这些情况超出了默认超时时间,即5000ms。为了避免超时错误,只需增加支持超时的全局变量的超时时间即可。全局列表及其签名可以在here中找到。
对于Jest 24.9

答案 9 :(得分:1)

我最近因另一个原因遇到了这个问题:我正在使用jest -i同步运行一些测试,但这只是超时。无论出于何种原因,使用jest --runInBand(即使-i都是别名)运行相同的测试也不会超时。

也许这会帮助某人¯\_(:/)_/¯

答案 10 :(得分:0)

对于那些正在寻找有关 jest --runInBand,您可以转到文档 在CI环境中运行木偶 https://github.com/smooth-code/jest-puppeteer

答案 11 :(得分:0)

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

如果是开玩笑<= 23:

// in jest.config.js
module.exports = {
  setupTestFrameworkScriptFile: './jest.setup.js'
}

如果开玩笑> 23:

// in jest.config.js
module.exports = {
  setupFilesAfterEnv: ['./jest.setup.js']
}

答案 12 :(得分:0)

如果有人不能解决上面的问题使用方法,我通过用箭头功能将异步功能包围起来来解决我的问题。如:

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);
});

答案 13 :(得分:0)

这是一个相对较新的更新,但更为直接。如果您使用的是jest 24.9.0或更高版本,则只需将testTimeout添加到您的配置中即可:

// in jest.config.js
module.exports = {
  testTimeout: 30000
}

答案 14 :(得分:0)

就我而言,此错误开始随机出现,即使将超时设置为30000也不会消失。只需在终端中结束该过程并重新运行测试即可为我解决该问题。我还删除了超时,测试仍在通过。

答案 15 :(得分:0)

您还可以根据愚蠢的错字获得超时错误。例如,这看似无害的错误:

describe('Something', () => {
  it('Should do something', () => {
    expect(1).toEqual(1)
  })

  it('Should do nothing', something_that_does_not_exist => {
    expect(1).toEqual(1)
  })
})

产生以下错误:

FAIL src/TestNothing.spec.js (5.427s)
  ● Something › Should do nothing

    Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.
      
      at node_modules/jest-jasmine2/build/queue_runner.js:68:21
      at Timeout.callback [as _onTimeout] (node_modules/jsdom/lib/jsdom/browser/Window.js:678:19)

虽然发布的代码示例没有受到此影响,但这可能是导致其他地方失败的原因。另外请注意,我没有在任何地方设置超时-在这里或5000ms的配置只是默认设置。

答案 16 :(得分:-12)

我的解决方案: 但我不知道它是否符合您的代码条件,但您可以试试这个。

it('GET should return a status of 200 OK', async (done) => {
  await frisby
    .get('api-url')
    .expect('status', 200)
    .done(done)
});