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

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

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);
    });
});

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


person Abhijeet Kharkar    schedule 13.02.2019    source источник


Ответы (1)


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

Из http://www.wheresrhys.co.uk/fetch-mock/#usageglobal-non-global:

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

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

Глобальная загрузка

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

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

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

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

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

Метод sandbox() возвращает функцию, которую можно использовать в качестве замены функции fetch. Передайте это в выбранную вами библиотеку насмешек. Функция, возвращаемая песочницей(), содержит все методы 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;
person Pajdziu    schedule 24.05.2019