如何使用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
相关产品推荐
相关产品推荐

