我在用木偶师和小丑做一些前端测试。

我的测试如下:

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 -在jest.setTimeout指定的5000毫秒超时时间内没有调用异步回调。 在node_modules/jest-jasmine2/build/queue_runner.js:68:21 <br/> 在超时。callback [as _onTimeout] (node_modules/jsdom/lib/jsdom/browser/Window.js:633:19)

这很奇怪,因为:

我将超时时间指定为30000 我是否得到这个错误似乎是随机的

为什么会这样?


当前回答

将此添加到您的测试中,无需过多解释

beforeEach(() => {
  jest.useFakeTimers()
  jest.setTimeout(100000)
})

afterEach(() => {
  jest.clearAllTimers()
})

其他回答

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

对于大于27的笑话版本,您可以在规范文件的顶部添加useRealTimers。

下面是代码片段

import { shortProcess, longProcess } from '../../src/index';

jest.useRealTimers();

describe(`something`, function () {
    it('should finish fine', async function () {
        await shortProcess();
        expect(1).toBe(1);
    });

    it('should fail with a timeout', async function () {
        await longProcess();
        expect(1).toBe(1);
    });

    it('should finish fine again', async function () {
        jest.setTimeout(10 * 1000);
        await longProcess();
        expect(1).toBe(1);
    }, 10000);
});

在笑话仓库这里找到github问题。

这可能对大多数访问此页面的人没有太大帮助,但当我得到这个错误时,它与Jest无关。我的一个方法调用是在本地运行时获得一个空对象和一个空异常。一旦我添加了一个空检查,失败的测试和控制台日志就消失了。

if(response !== null){
    this.searchSubj.next(resp);
 }
 else {
    return;
 }

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

您可以通过向it添加第三个参数来覆盖任何单个测试的超时。也就是说,它('运行缓慢',()=>{…}, 9999) 您可以使用jest.setTimeout更改默认值。这样做: / /配置 "setupFilesAfterEnv":[//不是setupFiles . ”。/ src /嘲笑/ defaultTimeout.js” ], 而且 //文件:src/jest/defaultTimeout.js /*全局笑话*/ jest.setTimeout (1000) 就像其他人注意到的那样(与此没有直接关系),对于async/await方法来说,done是不必要的。

如果有人不解决这个问题,请使用上述方法。我通过用箭头函数包围async func来修正我的错误。如:

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