使用Jest测试NestJS的createSession方法抛出异常时报错如何解决
问题根因
你的createSession是同步方法,没有返回Promise实例,而Jest的.rejects匹配器仅能捕获异步Promise抛出的拒绝异常,无法处理同步代码直接抛出的错误,因此测试执行时异常会直接向外抛出,导致测试失败。
解决方案
方案1:针对同步方法修改测试代码
直接使用Jest的.toThrow匹配器捕获同步异常,无需加async/await,示例代码如下:
it('should throw UNAUTHORIZED exception when user does not exist', () => { expect(() => service.createSession(mockLogin.login, mockLogin.password)) .toThrow(new HttpException('UNAUTHORIZED', HttpStatus.UNAUTHORIZED)); });
注意:必须把方法调用包裹在匿名函数里,否则异常会在expect执行前就抛出,无法被捕获。
方案2:调整业务方法为异步逻辑(推荐后续对接数据库时使用)
如果后续你需要对接数据库查询用户信息(异步操作),可以把createSession改为异步方法,此时原来的.rejects写法即可生效:
修改后的业务代码
async createSession(login: string, password: string) { // 后续可替换为数据库异步查询逻辑 const search: UserEntity = this.users.find( (user: UserEntity) => user.cpf === login, ); if (search) return search.senha === password; else throw new HttpException('UNAUTHORIZED', HttpStatus.UNAUTHORIZED); }
对应的测试代码无需大改,仅需注意逻辑匹配即可:
it('should throw UNAUTHORIZED exception when user does not exist', async () => { await expect( service.createSession(mockLogin.login, mockLogin.password), ).rejects.toEqual( new HttpException('UNAUTHORIZED', HttpStatus.UNAUTHORIZED), ); });
补充优化建议
你当前的测试用例描述should retrieve getHello和测试的登录会话逻辑不匹配,建议修改为对应功能的描述,便于后续测试结果排查。
内容的提问来源于stack exchange,提问作者Rajiv Milhomem
相关产品推荐
相关产品推荐

