我使用木偶戏和玩笑来进行一些前端测试。
我的测试如下:
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)
这很奇怪,因为:
我指定超时为30000
我是否收到此错误似乎非常随机
任何人都可以猜到为什么会这样吗?
答案 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)
还可以看到这个帖子
答案 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月):
您可以通过向<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())
您可以使用it
更改默认设置。为此:
it('runs slow', () => {...}, 9999)
和
jest.setTimeout
// 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)
});