方法读取正文时 Mocha 超时
Mocha times out when method reads body
序言:我知道 ,但没有找到有用的答案。那里接受的答案表明使用 async
和 await
应该可以解决这个问题,但事实并非如此。
我使用 Mocha 和 Supertest 在 TypeScript 中编写了这个测试:
it('returns 400 when redirectURL is missing', async () => {
const isAuthorized = (_req: Request) => true;
const hooks = { onPostAuth: async (_req: Request) => {} };
const app = createApp(isAuthorized, hooks);
await request(app)
.post('/')
.set('Content-Type', 'application/json')
.send({ }) // Body is missing redirectURL
.expect(400);
});
当我 运行 它时,正如预期的那样,测试失败了:
1) POST
returns 400 when redirectURL is missing:
Error: expected 400 "Bad Request", got 200 "OK"
此时,HTTP API 看起来像这样:
export function createApp(
isAuthorized: (_: Request) => boolean,
hooks: { onPostAuth: (_: Request) => any; })
{
const app = express();
const authorize = createAuthorizationHandler(isAuthorized);
app.post("/", authorize, async (req, res) => {
const result = await hooks.onPostAuth(req);
return res.send(result);
})
return app;
}
一切顺利。如果缺少所需的 属性,我现在在代码中向 return 400 Bad Requst
添加一个 if
语句:
app.post("/", authorize, async (req, res) => {
if (!req.body.redirectURL) {
return res.status(400).send();
}
const result = await hooks.onPostAuth(req);
return res.send(result);
})
虽然我希望测试通过,但它现在失败并显示以下错误消息:
3) POST
returns 400 when redirectURL is missing:
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (C:\Users\mark\Documents\Criipto\fusebit-extensibility\tests\index.test.ts)
at listOnTimeout (internal/timers.js:531:17)
at processTimers (internal/timers.js:475:7)
为什么会这样,我该怎么做才能解决这个问题?
实际上,只需阅读 req.body.redirectURL
就足以触发该行为:
app.post("/", authorize, async (req, res) => {
if (!req.body.redirectURL) {
}
const result = await hooks.onPostAuth(req);
return res.send(result);
})
虽然它没有在 if
语句中执行任何操作,但测试仍然会超时并挂起,如上所述。
感谢 cdimitroulas 的评论,事实证明我确实没有为正文解析设置 Express。添加这个:
app.use(express.json());
解决了问题。
序言:我知道 async
和 await
应该可以解决这个问题,但事实并非如此。
我使用 Mocha 和 Supertest 在 TypeScript 中编写了这个测试:
it('returns 400 when redirectURL is missing', async () => {
const isAuthorized = (_req: Request) => true;
const hooks = { onPostAuth: async (_req: Request) => {} };
const app = createApp(isAuthorized, hooks);
await request(app)
.post('/')
.set('Content-Type', 'application/json')
.send({ }) // Body is missing redirectURL
.expect(400);
});
当我 运行 它时,正如预期的那样,测试失败了:
1) POST
returns 400 when redirectURL is missing:
Error: expected 400 "Bad Request", got 200 "OK"
此时,HTTP API 看起来像这样:
export function createApp(
isAuthorized: (_: Request) => boolean,
hooks: { onPostAuth: (_: Request) => any; })
{
const app = express();
const authorize = createAuthorizationHandler(isAuthorized);
app.post("/", authorize, async (req, res) => {
const result = await hooks.onPostAuth(req);
return res.send(result);
})
return app;
}
一切顺利。如果缺少所需的 属性,我现在在代码中向 return 400 Bad Requst
添加一个 if
语句:
app.post("/", authorize, async (req, res) => {
if (!req.body.redirectURL) {
return res.status(400).send();
}
const result = await hooks.onPostAuth(req);
return res.send(result);
})
虽然我希望测试通过,但它现在失败并显示以下错误消息:
3) POST
returns 400 when redirectURL is missing:
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (C:\Users\mark\Documents\Criipto\fusebit-extensibility\tests\index.test.ts)
at listOnTimeout (internal/timers.js:531:17)
at processTimers (internal/timers.js:475:7)
为什么会这样,我该怎么做才能解决这个问题?
实际上,只需阅读 req.body.redirectURL
就足以触发该行为:
app.post("/", authorize, async (req, res) => {
if (!req.body.redirectURL) {
}
const result = await hooks.onPostAuth(req);
return res.send(result);
})
虽然它没有在 if
语句中执行任何操作,但测试仍然会超时并挂起,如上所述。
感谢 cdimitroulas 的评论,事实证明我确实没有为正文解析设置 Express。添加这个:
app.use(express.json());
解决了问题。