Невозможно смоделировать нод-выборку, используя 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;