Относительный 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