Относительный URL как имя хоста в Nock
Мне нужно обмануть HTTP-запросы на стороне клиента. Я использую isomorphic-fetch
на стороне клиента, и я использую mocha
и nock
для тестирования и издевательств. Все мои клиентские запросы основаны на относительном пути. Из-за этого я не могу предоставить имя хоста для nock
. Есть ли работа.
Клиентская сторона:
fetch('/foo') //hostname: http://localhost:8080
.then(res => res.json())
.then(data => console.log(data))
.catch(e => console.log(e))
Комплект тестов
nock('/')
.get('/foo')
.reply(200, {data: "hello"})
Это не работает, поскольку я не указываю правильное имя хоста для nock
. Я что-то делаю неправильно?
Ответы
Ответ 1
Обнаружено обходное решение для этого. Имейте _ajax-setup.js
в тестовой папке
import $ from 'jquery'
$(document).ajaxSend((event, jqxhr, settings) => {
settings.url = 'http://0.0.0.0' + settings.url;
})
Следует отметить, что этот файл должен запускать Первый и Только один раз. Наличие файла в качестве файла выполняется только один раз и _
, прежде чем оно будет сначала в алфавитном порядке.
Позже вы можете протестировать свой код с помощью
nock('http://0.0.0.0')
.get('/foo')
.reply(200, {data: "hello"})
Ответ 2
Для всех, кого это интересует: в моем проекте response/webpack я решил это, добавив URL-адрес извлечения http://localhost ', когда NODE_ENV
установлен на 'test'
.
Пример:
const testing = process.env.NODE_ENV === 'test';
const apiUrl = `${testing ? 'http://localhost' : ''}/api`;
function getStuffFromApi() {
return fetch(apiUrl, ...)
}
Таким образом, в моем тесте я всегда могу использовать нок:
nock('http://localhost')
.get('/api')
.reply(200, {data: 'hello'})
ПРИМЕЧАНИЕ. При выполнении моих тестов NODE_ENV устанавливается в 'test'
Ответ 3
Для аксиомов я добавил следующий в свой тестовый файл. Это помогло преодолеть это ограничение.
axios.defaults.baseURL='http://localhost:4000/';
Обратите внимание, что это глобальная переменная.
При этом фактический код может жить с относительным URL-адресом, и нет необходимости проверять в нем флаг проверки.
Ответ 4
Я просто задал аналогичный вопрос в репозитории Nock. По-видимому, это не поддерживается: https://github.com/pgte/nock/issues/431
Ответ 5
kudresov ответ на проблема liorbauer описывает обходное решение, зависящее от Jest.
Поместите это в __mocks __/isomorphic-fetch.js:
const fetch = require.requireActual('isomorphic-fetch');
module.exports = (url, config) => {
return fetch('https://localhost' + url, config);
};
Jest затем автоматически заменяет все требуемые (или импортирует) для этого модуля node.
В других тестовых средах вы можете использовать что-то вроде rewire