Как имитировать экспортированную функцию, которая возвращает другие функции в объекте? - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь выполнить модульное тестирование клиента, который используется для вызовов REST API, используя fetch. Мне сложно понять, как правильно имитировать и шпионить за функциями клиентов, которые используются для выполнения этих вызовов выборки.

Вот пример того, как построен этот клиент:

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 call, но хотел бы создать слежку за 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? Кроме того, могу ли я лучше структурировать этот тест, чтобы доказать, что обновленный элемент верен?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...