4

我有以下用于fetch()进行 API 调用的函数:

export async function fetchCars(dealershipId) {
  return request('path/to/endpoint/' + dealershipId)
    .then((response) => {
      if (response.ok === false) {
        return Promise.reject();
      }
      return response.json();
    })
    .then((cars) => {
      return parseMyCars(cars);
    });
}

我想测试调用何时失败(特别是何时return Promise.reject()返回)。我现在有以下 Jest 测试:

(fetch as jest.Mock).mockImplementation(() =>
    Promise.resolve({ ok: false })
);
const result = await fetchCars(1);
expect(request).toHaveBeenCalledWith('/path/to/endpoint/1');
expect(result).toEqual(Promise.reject());

但我Failed: undefined在运行测试时收到一条消息。我试过使用:

(fetch as jest.Mock).mockRejectedValue(() =>
  Promise.resolve({ ok: false })
);

但收到类似的Failed: [Function anonymous]消息。

在这里测试被拒绝的承诺的正确方法是什么?

4

2 回答 2

0

您的测试失败,因为它引发了异常。您需要捕获该异常,有很多方法可以做到这一点,使用拒绝助手就是其中之一:

it("should fail", async () => {
    (window.fetch as jest.Mock).mockResolvedValueOnce({
      ok: false,
    });
    await expect(fetchCars(1)).rejects.toEqual(/* error you are expecting*/);
});
于 2021-12-29T15:46:42.333 回答
-1

有几种方法可以正确处理这个问题。我认为问题在于您正在等待您的承诺。

如果您打算使用 await 那么您必须等待期望:

const result = fetchCars(1);
await expect(result).toEqual(Promise.reject());
// ✅ Correct setup

或者您可以返回未等待的承诺:

const result = fetchCars(1);
return expect(result).toEqual(Promise.reject());
// ✅ Correct setup

如果您不返回或等待预期,那么您可能会注意到您得到了误报:

const result = fetchCars(1);
expect(result).toEqual(Promise.reject());
// ❌ False positive!

我创建了一个代码框示例,向您展示如何模拟 fetch 函数以及如何正确设置测试,包括不正确的方法。试一试右上角的“测试”选项卡。

于 2021-12-25T09:54:09.780 回答