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

如何在Jest中处理Promise测试 出现Promise已决议而非被拒绝报错怎么办

错误原因

这个报错说明你期望抛出AppError的createMedia.execute方法实际正常执行完成并返回了媒体创建成功的结果,核心是「用户不存在就拒绝创建」的业务逻辑没有生效。

排查方向
  • 优先检查测试用例的模拟逻辑是否正确:你当前的操作是将user.user字段设为undefined后再保存,本质上这条用户记录仍存在于数据库中。如果createMedia的校验逻辑是通过传入的userId查询用户是否存在,只要user.id对应的记录存在,校验就会通过,自然不会抛出异常。
  • 检查createMedia.execute的内部实现:确认是否存在「用户不存在时抛出AppError」的分支逻辑,该逻辑有没有被遗漏,或者抛出的异常类型是不是你预期的AppError。
  • 检查是否有异常被内部吞掉:确认createMedia.execute内部的try/catch有没有把校验抛出的错误捕获后没有向外抛出,导致外层接收到的是resolved状态的Promise。
修复示例

如果要模拟用户不存在的场景,直接删除对应用户记录即可:

it("should not create a media if the user doesn't exist", async () => {
    // 删除用户,模拟用户不存在的场景
    await usersRepository.delete(user.id);

    await expect(
      createMedia.execute({
        userId: user.id,
        type: 'video',
        media: 'video-media',
        description: 'description',
      }),
    ).rejects.toBeInstanceOf(AppError);
  });

同时确认createMedia内部存在对应校验:

async function execute(mediaParams) {
  const user = await usersRepository.findById(mediaParams.userId);
  // 校验用户不存在时抛出指定异常
  if (!user) {
    throw new AppError('用户不存在', 400);
  }
  // 其余业务逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:57:03