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

