首页 > 解决方案 > 我如何处理 Jest 中的承诺?

问题描述

我在这部分代码中遇到了错误。Received promise resolved instead of rejected我不知道如何处理这个,有人可以帮助我吗?

it("should not create a media if the user doesn't exist", async () => {
    user.user= undefined;
    await usersRepository.save(user);

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

和:

expect(received).rejects.toThrow()

    Received promise resolved instead of rejected
    Resolved to value: {"description": "description", "id": "id number", "media": "video-media", "userId": "id user", "type": "video"}

标签: javascriptnode.jstypescriptpromisejestjs

解决方案


您的代码正在创建一个成功的承诺,然后您针对拒绝进行测试,因此它失败了,因为它成功执行并且您告诉它您希望它失败。

当您使用时,.rejects您是在告诉expect您希望它失败并被拒绝,在这种情况下它是成功的。如果将其更改为 aresolves而不是 a rejects,它将起作用。

或者您必须通过更新不存在的内容来确保您正在执行的查询实际上会失败。

另一种方法是实际执行您的查询,从中获取结果,然后expect对返回数据进行断言。

为了更清楚,一个正常的承诺看起来像这样:

const example = () => new Promise((resolve, reject) => ...

然后你可以调用这些resolve 和reject 方法,这取决于promise 是否正确解析或者如果它失败了你可以调用reject。当您使用.resolves.rejects开玩笑时,它正在测试 promise 上的那些 resolve 和 reject 方法。

当您使用一个async函数时,您实际上并没有看到它,但它正在做同样的事情。

更重要的是,当用户上传的文件超出实际容量时,它会中断,这就是为什么在您的情况下它实际上并没有失败,因为它实际上确实被拒绝了。


推荐阅读