通过尝试使用supertest
(和jest
)来测试一个极简示例,我遇到了以下问题:
Timeout - Async callback was not invoked within the 60000ms timeout specified by jest.setTimeout.
请注意,这不是SO上其他问题的重复,因为即使使用Jasmine大大扩展了默认超时值,我仍然遇到问题。我倾向于认为此问题可能是由于使用resource-router-middleware
而引起的,这篇文章可能对其他人有用。
我的完整示例是:
foo.js
import resource from 'resource-router-middleware'
export default () => resource({
id: 'foo',
create: [
(req, res) => {
res.status(201).json({ 'foo': 'bar' })
}
]
})
foo.test.js
import request from 'supertest'
import foo from 'foo'
jasmine.DEFAULT_TIMEOUT_INTERVAL = 60000
test('create should return 201', () => {
return request(foo).post('/').then(response => {
expect(response.statusCode).toBe(201)
})
})
完全错误
FAIL foo.test.js (61.578s)
✕ create should return 201 (60047ms)
● create should return 201
Timeout - Async callback was not invoked within the 60000ms timeout specified by jest.setTimeout.
4 | jasmine.DEFAULT_TIMEOUT_INTERVAL = 60000
5 |
> 6 | test('create should return 201', () => {
| ^
7 | return request(foo).post('/').then(response => {
8 | expect(response.statusCode).toBe(201)
9 | })
at Spec (node_modules/jest-jasmine2/build/jasmine/Spec.js:85:20)
at Object.test (foo.test.js:6:1)
答案 0 :(得分:0)
似乎缺少关于resource-router-middleware是什么以及应如何正确使用它的文档。但是,从source code中我们可以看到它是router。 因此,这意味着我们必须为此指定路由路径。
因此,您的foo.js
可能会执行以下操作:
import resource from 'resource-router-middleware'
const express = require('express');
const app = express();
const mw = resource({
id: 'foo',
create: [
(req, res) => {
res.status(201).json({ 'foo': 'bar' })
}
]
})
// actual bind to our resources to '/' route
// app.post('/', mv) is fine too, but
// if you describe more than 1 resource, it doesn't have much sense
app.all('/', mw);
export default app;
或者,使用route.route:
mw.route('/');
app.use(mw);
当然,还有其他方法可以用于路由绑定,我只展示了发现的第一个方法。但是,我的回答的总体思路是-resource-router-middleware
必须绑定到快速应用程序。
希望有帮助。