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

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

我的测试如下:

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毫秒超时时间内没有调用异步回调。

     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. 我是否得到这个错误似乎非常随机

为什么会这样?

436802 次浏览

此处指定的超时时间必须小于默认超时时间。

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

jest.setTimeout(30000);

但这是针对测试的。或者,您可以为框架设置配置文件。

配置笑话

// 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)

请参见这些线程:

setTimeout per test #5055

制作茉莉花。DEFAULT_TIMEOUT_INTERVAL可配置#652

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

它应该调用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);
});

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

Timeout -在jest.setTimeout指定的5000ms超时内没有调用异步回调。

感谢塔伦的回答很好,我认为修复大量测试的最短方法是:

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


test('Best Jest test fest', async () => {
// Blah
});
});

确保在回调时调用done();,否则它根本无法通过测试。

beforeAll((done /* Call it or remove it */ ) => {
done(); // Calling it
});

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

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

  1. 你可以通过在it中添加第三个参数来覆盖任何单个测试的超时。也就是说,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对于async/await方法来说是不必要的。

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

对于那些正在寻找一个解释关于

. jest --runInBand,你可以去文档

在CI环境中运行木偶师

GitHub - smooth-code/ Jest -puppeteer:使用Jest &运行您的测试;操纵木偶的< / >

当网络很慢或使用await进行许多网络调用时,就会出现超时问题。这些场景超过了缺省超时时间,即5000毫秒。要避免超时错误,只需增加支持超时的全局变量的超时。全局变量及其签名的列表可以在在这里中找到。

For Jest 24.9

对于Jest 24.9+,您还可以通过添加--testTimeout从命令行设置超时。

下面是它的文档的节选:

< p > --testTimeout=<number> < br > 测试的默认超时(以毫秒为单位)。缺省值:5000

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

如果在Jest <= 23:

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

如果在玩笑>23:

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

如果有人不解决这个问题,请使用上述方法。我通过用箭头函数包围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);
});

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

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

在我的例子中,这个错误开始随机出现,即使在设置超时30000之后也不会消失。只需在终端中结束进程并重新运行测试,就可以为我解决这个问题。我还删除了超时,测试仍然再次通过。

还有另一个解决方案:在Jest配置文件中设置超时,例如:

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

你也可以得到基于愚蠢的拼写错误的超时错误。例如,这个看似无伤大雅的错误:

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)

虽然所发布的代码示例没有受到这种影响,但它可能是其他地方失败的原因。还要注意,我没有为任何地方设置超时——无论是在这里还是在配置中。5000毫秒只是默认设置。

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

--testTimeout= 10000 // Timeout of 10 seconds

缺省超时值为5000 (5000 ms - 5秒)。这将适用于所有测试用例。

或者如果您只想给特定的函数超时,那么您可以在声明测试用例时使用此语法。

test(name, fn, timeout)

例子

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


}, 10000); // Timeout of 10 seconds (default is 5000 ms)

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

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


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

落下我的2美分在这里,我有同样的问题在dosen的jest单元测试(不是所有的),我注意到,所有开始后,我添加到jestSetup这个polyfill为MutuationObservers:

if (!global.MutationObserver) {
global.MutationObserver = function MutationObserverFun(callback) {
this.observe = function(){};
this.disconnect = function(){};
this.trigger = (mockedMutationsList) => {
callback(mockedMutationsList, this);
};
};
}

一旦我删除它测试开始工作再次正确。希望能帮助别人。

事实证明,如果您的expect断言是错误的,它有时会吐出超过超时的错误消息。

我能够通过在promise回调中放入console.log()语句来解决这个问题,并看到console.log()语句在jest输出中运行。一旦我修复了expect断言,超时错误就消失了,测试可以正常工作。

我花了很长时间才弄明白,希望这能帮助需要阅读这篇文章的人。

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

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

2022年3月14日,Jest 27.5文档表明了一个新流程:

< a href = " https://jestjs。io / docs / api # beforeallfn-timeout noreferrer“rel = > https://jestjs.io/docs/api beforeallfn-timeout < / >

在超时前传递第二个参数测试msec的个数。作品!

test('adds 1 + 2 to equal 3', () => {
expect(3).toBe(3);
},30000);

test接受timeout实参。看到https://jestjs.io/docs/api#testname-fn-timeout。下面是一个例子:

async function wait(millis) {
console.log(`sleeping for ${millis} milliseconds`);
await new Promise(r => setTimeout(r, millis));
console.log("woke up");
}
test('function', async () => {
await wait(5000);
}, 70000);

对于大于27的笑话版本,可以在spec文件顶部添加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问题在这里笑话仓库。