Невозможно смоделировать нод-выборку, используя fetch-mock - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь выполнить модульное тестирование для простой функции, которая отправляет запрос 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);
    });
});

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

1 Ответ

0 голосов
/ 24 мая 2019

Если вы используете пакет 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-mock

Global fetch

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

  • При использовании нативной выборки (или полизаполнения) в браузере
  • Когда нод-выборка была назначена глобальной в вашем процессе 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;
...