我正在测试以下端点:
app.post('/api/master/makeLeaderInZone', authenticateMaster, (request, response) => {
var body = _.pick(request.body, ['zoneId', 'leaderId'])
Zone.findById(body.zoneId).then((zone) => {
if (zone) {
return zone.addLeader(body.leaderId)
} else {
return Promise.reject()
}
}).then(() => {
return Volunteer.findById(body.leaderId)
}).then((volunteer) => {
if (volunteer) {
return volunteer.addToZoneAsLeader(body.zoneId)
} else {
return Promise.reject()
}
}).then(() => {
response.status(200).send()
}).catch((error) => {
response.status(400).send()
})
})
这是我正在使用的测试:
describe('makeLeaderInZone', () => {
test('neither zone nor volunteer valid', () => {
request(app)
.post('/api/master/makeLeaderInZone')
.set('master-auth', 'master')
.send().expect(400)
})
})
当我使用邮递员测试它时,这个端点运行良好。但是,通过此测试,我收到以下错误:
超时 - 在 5000 毫秒超时内未调用异步回调 由 jest.setTimeout 指定。错误:超时 - 异步回调不是 在 jest.setTimeout 指定的 5000 毫秒超时内调用。
如本答案所述,我在测试中添加了以下代码行,以使开玩笑等待更长的时间才能完成我的请求:
jest.setTimeout(30000);
但是,我仍然得到了完全相同的错误。就好像开玩笑忽略了这条线,只等了5000ms。
我应该怎么做才能使这个测试工作?
只是为了确认,您是否将 setTimeout 选项添加到此处引用的 jest.setup.js 文件中?
https://jestjs.io/docs/en/configuration#setupfilesafterenv-array
为了逐个测试地设置它,您需要将其设置为测试的第三个参数。
test('example', async () => {
await new Promise(resolve => setTimeout(resolve, 1000));
}, 500);
所以在你的例子中,它会是
describe('makeLeaderInZone', () => {
test('neither zone nor volunteer valid', () => {
request(app)
.post('/api/master/makeLeaderInZone')
.set('master-auth', 'master')
.send().expect(400)
}, 30000)
})
我终于想通了。我不知道为什么,但出于某种原因,如果我输入以下代码行:
jest.setTimeout(30000);
在测试函数本身中,jest 只是忽略它并使用默认超时值 5000 毫秒。但是如果我把这一行放在描述块内,但在测试本身之外,就像这样:
describe('makeLeaderInZone', () => {
jest.setTimeout(10000)
test('neither zone nor volunteer valid', async () => {
await request(app)
.post('/api/master/makeLeaderInZone')
.set('master-auth', 'master')
.send().expect(400)
})
})
它运行良好并等待我的请求完成(大约需要 8.5 秒(。