如何模拟导出的函数以在对象中返回其他函数?

时间:2020-05-06 21:21:56

标签: javascript node.js unit-testing jestjs

我正在尝试对使用fetch进行REST API调用的客户端进行单元测试。我无法弄清楚如何正确模拟和监视用于进行这些访存调用的客户端功能。

以下是此客户端的构造示例:

export const client = (param1, param2) => {
  const getItem = (id) => fetch(fakeUrl, {method: GET});

  const updateItem = (id) => fetch(fakeUrl, {method: POST});

  return {
    getItem: getItem,
    updateItem: updateItem
}

在我的客户端测试文件中,我试图测试updateItem并模拟getItem,因为它是从内部调用的。我第一次尝试简单地模拟fetch,但是我更喜欢模拟getItem的实现,以简单地返回正确的项目进行测试。

目前,我通过模拟每个fetch调用来进行此工作,但想在getItem上创建一个间谍,以确保使用正确的参数对其进行调用,并能够进行模拟它的返回值。

    it("Should return the updated item", async () => {
      expect.assertions(1);
      // Setup
      const item = {
        id: "123
      };

      // Get item
      fetch.mockResponseOnce(JSON.stringify({ item }));

      // Update item with data
      fetch.mockResponseOnce(JSON.stringify({ ...item, data }));

      // When
      const updatedItemWithData = await client(
        "/item",
        "fakeToken"
      ).updateItem("123456", data);

      // Then
      expect(updatedItemWithData).toEqual({ ...item, data });
    });

在上面的代码中,我的目标是测试updateItem返回我认为会返回的结果。更新项目首先需要获取该项目,这就是为什么我模拟了第一个fetch以返回我期望的项目的原因。然后,在处理了一些数据之后,我再次调用fetch以更新该项目,这就是为什么我有第二个模拟值。

问题:如何编写测试,以便我可以模拟整个getItem而不是fetch?另外,我能否以更好的方式来构造此测试,以证明更新的项目是正确的?

0 个答案:

没有答案