Jest - TypeError: response.json не является функцией - PullRequest
0 голосов
/ 29 октября 2019

Мы проводим модульное тестирование приложения React-Native (с использованием Jest), которое выполняет различные вызовы API с использованием fetch. Мы протестировали вызовы fetch в наших функциях вызова API, чтобы протестировать их. Пока это хорошо работает. У нас также есть функции, которые объединяют эти вызовы API и работают с ними. Например, вот одна функция, которая с учетом токена получает первый проект связанного пользователя (project[0]) и возвращает список элементов этого проекта.

export async function getAllItems(token) {
  try {
    const response = await getCurrentUser(token); // fetch called inside
    const responseJson = await response.json();
    const allItemsResp = await getAllItemsFromSpecificProject(
      token,
      responseJson.projectIds[0],
    );                                            // fetch called inside
    return await allItemsResp.json();
  } catch (error) {
    console.log(error);
    return null;
  }
}

Обе функции getCurrentUser иgetAllItemsFromSpecificProject - это простые fetch звонки, и в настоящее время они корректно издеваются. Вот один тест, который пытается проверить функцию getAllItems:

it('Gets all items', async () => {
  getAccessTokenMockFetch();
  const token = await getAccessToken('usherbrooke@powertree.io', 'test!23');

  getAllItemsMockFetch();
  const items = await getAllItems(token.response.access_token);

  expect(items.response.length).toEqual(3);
});

Для ясности, вот как getAccessTokenMockFetch делается. getAllItemsMockFetch практически идентичен (с различными данными в ответе):

function getAccessTokenMockFetch() {
  global.fetch = jest.fn().mockImplementation(() => {
    promise = new Promise((resolve, reject) => {
      resolve(accepted);
    });

    return promise;
  });
}

, где принято, содержит содержимое JSON успешного вызова. Когда мы запускаем этот тест, мы получаем следующую ошибку:

TypeError: Cannot read property 'response' of null

, и мы console.log этот в подвохе:

TypeError: response.json is not a function

, который объясняет, почему ответ null. Кажется, вызов json() не понят, и я не знаю, как его высмеивать. Я провел множество исследований SO и не только, но не нашел ничего, что помогло бы мне понять, как решить эту проблему. Это может указывать на то, что я иду по этому пути неправильно, что вполне возможно, поскольку я новичок в Javascript, React-Native и Jest.

Любая помощь по этому вопросу будет принята с благодарностью.

1 Ответ

1 голос
/ 29 октября 2019

Одна вещь, которую стоит попробовать, это дать ей поддельный JSON для звонка, например:

const mockFetch = Promise.resolve({ json: () => Promise.resolve(accepted) });
global.fetch = jest.fn().mockImplementation(() => mockFetchPromise);
...