NestJS控制器异常处理Jest单元测试报错排查求助
解决NestJS控制器异常测试的失败问题
看起来你的测试用例逻辑有个关键问题——你当前mock的是userService.updateUser成功返回undefined,但你的控制器只有在service抛出异常时才会触发HttpException。所以控制器代码会正常执行return await this.userService.updateUser(user),不会进入catch块,自然不会抛出你期望的500错误,测试就会走到.then()分支执行done.fail(),这就是你看到报错的根源。
修复步骤
1. 修正Service的Mock行为
把mockResolvedValue改为mockRejectedValue,让service主动抛出异常,这样控制器才能捕获并转换为500状态的HttpException:
// 替换原来的mockResolvedValue jest.spyOn(userservice, 'updateUser').mockRejectedValue(new Error('用户更新失败'));
2. 优化测试写法(推荐)
使用Jest的expect().rejects语法结合async/await,比done回调更简洁,也能避免异步测试的回调陷阱:
it('should throw INTERNAL_SERVER_ERROR if user update fails', async () => { const testuser = new UpsertUserDto(); testuser.id = '123'; // Mock service抛出异常 jest.spyOn(userservice, 'updateUser').mockRejectedValue(new Error('用户更新失败')); // 断言控制器会抛出HttpException const error = await expect(usercontroller.updateUser(testuser)).rejects.toThrow(HttpException); // 验证异常的状态码和信息 expect(error.status).toBe(HttpStatus.INTERNAL_SERVER_ERROR); expect(error.message).toBe('用户更新失败'); });
额外说明
如果你的userService.updateUser在实际业务中抛出的是自定义异常,直接mock该自定义异常即可,这样控制器捕获到的错误信息会更贴近真实场景。另外,避免使用done回调能减少异步测试中常见的超时、未触发等问题。
内容的提问来源于stack exchange,提问作者sandeep singh
相关产品推荐
相关产品推荐

