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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:15:02