You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Mocha测试ExpressJS中自定义错误处理器的错误逻辑?

解决Mocha测试Express自定义错误处理器的问题

你的问题出在对supertest(也就是你用的request(app))的行为理解上——它不会因为请求返回4xx/5xx状态码就抛出异常,所以你的try/catch块根本不会被触发。

为什么原来的代码不行?

你的自定义错误处理器已经把抛出的AppError转换成了一个标准的HTTP响应(设置了401状态码并返回错误体),supertest接收到这个响应后会正常返回response对象,而不是抛出异常。只有当请求本身出现网络问题、超时或者Express服务器崩溃这类情况时,才会进入catch块。

修改后的正确测试用例

直接断言响应的状态码和响应体内容即可:

it('should fail trying to GET bookmarks with false user id', async () => { 
  const response = await request(app)
    .get(`${baseApiUrlUnderTest}false_user_id/bookmarks`)
    .set('Authorization', bearerToken); 

  // 断言状态码
  expect(response.status).to.equal(HttpStatus.UNAUTHORIZED);
  // 可选:断言响应体的错误信息
  expect(response.body.message).to.equal('Unauthorized');
  expect(response.body.errors).to.deep.equal(['the userId does not match the subject in the access token']);
});

额外说明

如果你的Express代码里有未被错误处理器捕获的异常(比如没有用wrapAsync包裹异步函数,或者没有把异常传给next),这时候supertest才会抛出异常进入catch块。但你的代码里已经通过wrapAsync把异步函数的异常传给了next,又通过自定义错误处理器转换成了HTTP响应,所以完全不需要用try/catch来捕捉。

内容的提问来源于stack exchange,提问作者ama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:41:06