Мне нужно издеваться над 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. Я делаю что-то неправильно?

18
Pranesh Ravi 16 Дек 2015 в 20:26

5 ответов

Лучший ответ

Нашел обходной путь для этого. _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
bigOmega 20 Фев 2016 в 07:44

Для axios я добавил следующее в мой тестовый файл. Это помогло преодолеть это ограничение.

    axios.defaults.baseURL='http://localhost:4000/';

Обратите внимание, что это глобальная переменная. При этом реальный код может соответствовать относительному URL, и нет необходимости проверять флаг тестирования в нем.

2
Amit Teli 18 Ноя 2016 в 17:43

Для всех, кто интересуется: в своем проекте «Реакция / Веб-пакет» я решил эту проблему, добавив URL-адрес извлечения с помощью http: // localhost 'когда {{ X0}} имеет значение 'test'.

Пример:

const testing = process.env.NODE_ENV === 'test';
const apiUrl = `${testing ? 'http://localhost' : ''}/api`;

function getStuffFromApi() {
  return fetch(apiUrl, ...)
}

Таким образом, в моем тесте я всегда могу использовать nock следующим образом:

nock('http://localhost')
  .get('/api')
  .reply(200, {data: 'hello'})

ПРИМЕЧАНИЕ . При выполнении моих тестов NODE_ENV устанавливается на "тест"

6
0xRm 22 Июн 2016 в 13:03

Я только что задал похожий вопрос в хранилище Нока. По-видимому, это не поддерживается: https://github.com/pgte/nock/issues/431

1
lior 23 Дек 2015 в 12:13

В ответе Кудресова на проблему liorbauer описывается обходное решение для Jest.

Поместите это в __mocks __ / isomorphic-fetch.js:

const fetch = require.requireActual('isomorphic-fetch');

module.exports = (url, config) => {
  return fetch('https://localhost' + url, config);
};

Затем Jest автоматически заменяет все требования (или импортирует) для этого модуля узла.

В других тестовых средах вы можете использовать что-то вроде rewire

1
Aaron 11 Апр 2017 в 21:32