方法读取正文时 Mocha 超时

Mocha times out when method reads body

序言:我知道 ,但没有找到有用的答案。那里接受的答案表明使用 asyncawait 应该可以解决这个问题,但事实并非如此。


我使用 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());

解决了问题。