Как протестировать функцию, которая возвращает обещание fetch

Мне никогда раньше не приходилось тестировать такую ​​функцию. Любые идеи были бы хорошы. Функция в основном передает URL-адрес для извлечения и возвращает json. URL-адрес сообщает fetch, какой статический файл json нужно получить.

const getJSON = async <T>(url): Promise<T> => {
  try {
    return await fetch(url).then(res => {
      if (!res.ok) {
        throw new Error('Network response was not ok.');
      }

      if (!res.headers.get('content-type').includes('application/json')) {
        throw new Error('Response is not JSON');
      }

      return res.json();
    });
  } catch (e) {
    // some error handling
  }
};

export default fetchJSON;

На первый взгляд я даже не знаю, что тестировать. Единственное, что я придумал, это попытаться шпионить за методом выборки и заставить ответ быть какими-то фиктивными данными. Я попробовал следующее. Я попытался издеваться над получением и вызовом. Ожидание, показанное ниже, проходит, но переменная результата не определена, поэтому я не могу проверить какое-либо возвращаемое значение.

import fetchJSON from '../fetchJSON';

global.fetch = jest.fn(() =>
  Promise.resolve({
    json: () => Promise.resolve({ name: 'foo' }),
  })
);

beforeEach(() => {
  fetch.mockClear();
});

it('finds blah blah', async () => {
  const result = await fetchJSON('');

  expect(fetch).toHaveBeenCalledTimes(1);
});

person Aaron    schedule 07.12.2020    source источник
comment
Надеюсь, это поможет вам. stackoverflow.com/ вопросы/57196162/   -  person danilovxp    schedule 08.12.2020
comment
Единственное, что нужно проверить в предоставленном коде, — это пользовательские ошибки. Все остальное в этом коде — просто внутренний API, который уже протестирован. Поэтому настройте сценарии reject и сценарии, отличные от 400.   -  person Randy Casburn    schedule 08.12.2020
comment
но результирующая переменная не определена - не должно быть.   -  person Bergi    schedule 08.12.2020
comment
Ваш тестовый двойник не соответствует интерфейсу, который он должен заменить. Вы могли бы издеваться над API-интерфейсом выборки, но по причинам, которые я раскрываю в stackoverflow.com/a/65130857/3001761, это было бы лучше отделить ваш код от него.   -  person jonrsharpe    schedule 08.12.2020
comment
это потому, что OP ничего не возвращает из макета - макет должен возвращать обещание точно так же, как это делает выборка.   -  person Randy Casburn    schedule 08.12.2020