Невозможно смоделировать нод-выборку, используя fetch-mock

Я пытаюсь выполнить модульное тестирование для простой функции, которая отправляет запрос get, получает ответ, а затем возвращает объект обещания с сообщением об успехе или ошибке. Следующее является функцией:

module.exports.hello = async (event, context) => {
  return new Promise((resolve, reject) => {
    fetch("https://httpstat.us/429", { headers: { 'Content-Type': 'application/json' } }).then(response => {
      console.log(response);
      if (response.status == 200) {
        return response;
      } else {
        throw Error(response.status + ": " + response.statusText);
      }
    }).then(tokenData => {
      resolve({ status: 200, body: JSON.stringify({ statusText: 'Success' }) });
    }).catch(error => {
      reject(error.message);
    });
  });
};

Во время модульного тестирования я использую fetch-mock, чтобы смоделировать вызов API и получить пользовательский ответ. Ниже приведен код:

it('hello returns failure message', (done) => {
    fetchMock.get('*',  {
        status: 429,
        statusText: "Too Many Nothings",
        headers: { 'Content-type': 'application/json' }
     });

    edx.hello(null, null).catch(error => {
        expect(error).to.equal('429: Too Many Requests');
    }).then(() => {
        done();
    }).catch(error => {
        done(error);
    });
});

Но этот код не издевается над запросом на выборку, поскольку, когда я печатаю текст ответа, это "Too Many Requests ", который отправляется в качестве ответа API, а не "Too Many Nothings ", который подвергается насмешке. Я новичок в NodeJS. Пожалуйста, скажите мне, что я делаю не так.

2 ответа

Какfetchимпортировано в ваш файл, используемый вашей функцией? У меня есть действительно простой (почти) файл VanillaJs, который использовалimport fetch from "cross-fetch";но это означалоfetchMockиз моего тестового файла игнорировался. Переключение наimport "cross-fetch/polyfill";позволил мне иметь тесты, которые предоставляли имитированные данные выборки , и я мог иметь тесты, которые также обращались к реальным данным.

Если вы используете node-fetch пакет, он не доступен в глобальном масштабе в Node.js. Чтобы сделать fetch-mock работа, которую вы либо должны назначить fetch global объект (например, import "node-fetch"; вместо import fetch from "node-fetch";) или сделать выборку инъекционной для вашего проверенного метода.

С http://www.wheresrhys.co.uk/fetch-mock/:

Глобальный или неглобальный

fetch может использоваться вашим кодом глобально или локально. Важно определить, какой из них применим к вашей кодовой базе, так как это повлияет на то, как вы используете fetch-mock

Глобальный выбор

В следующих сценариях выборка будет глобальной

  • При использовании нативной выборки (или полизаполнения) в браузере
  • Когда извлечение узла было назначено глобально в вашем процессе Node.js (шаблон, иногда используемый в изоморфных кодовых базах)

По умолчанию fetch-mock предполагает, что fetch является глобальным, поэтому больше не требуется никаких настроек после того, как вам понадобится fetch-mock. Неглобальная библиотека выборки

В следующих сценариях выборка не будет глобальной

  • Использование node-fetch в Node.js без привязки к глобальному
  • Использование fetch-ponyfill в браузере
  • Использование библиотек, которые используют fetch-ponyfill внутри
  • Некоторые настройки сборки приводят к неглобальной выборке, хотя не всегда очевидно, что это так

Метод sandbox() возвращает функцию, которую можно использовать в качестве замены для извлечения. Передайте это в вашу любимую библиотеку выбора. Функция, возвращаемая sandbox(), содержит все методы fetch-mock, например:

const fetchMock = require('fetch-mock'); const myMock =
fetchMock.sandbox().mock('/home', 200); // pass myMock in to your
application code, instead of fetch, run it, then...
expect(myMock.called('/home')).to.be.true;
Другие вопросы по тегам