我如何处理 Jest 中的承诺?

How can I handle a promise in 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"}

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

当您使用 .rejects 时,您是在告诉 expect 您预计它会失败并被拒绝,在本例中它会成功。如果将其更改为 resolves 而不是 rejects,它将起作用。

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

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

为了更清楚起见,正常的承诺如下所示:

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

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

当您使用 async 函数时,您实际上看不到它,但它在做同样的事情。

更重要的是,当用户上传的文件多于他们实际可以上传的文件时,它就会崩溃,这就是为什么在你的情况下它实际上并没有失败,因为那样它确实会被拒绝。