Мне нужно издеваться над 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
. Я делаю что-то неправильно?
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"})
Для axios я добавил следующее в мой тестовый файл. Это помогло преодолеть это ограничение.
axios.defaults.baseURL='http://localhost:4000/';
Обратите внимание, что это глобальная переменная. При этом реальный код может соответствовать относительному URL, и нет необходимости проверять флаг тестирования в нем.
Для всех, кто интересуется: в своем проекте «Реакция / Веб-пакет» я решил эту проблему, добавив 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 устанавливается на "тест"
Я только что задал похожий вопрос в хранилище Нока. По-видимому, это не поддерживается: https://github.com/pgte/nock/issues/431а>
В ответе Кудресова на проблему liorbauer описывается обходное решение для Jest.
Поместите это в __mocks __ / isomorphic-fetch.js:
const fetch = require.requireActual('isomorphic-fetch');
module.exports = (url, config) => {
return fetch('https://localhost' + url, config);
};
Затем Jest автоматически заменяет все требования (или импортирует) для этого модуля узла.
В других тестовых средах вы можете использовать что-то вроде rewire
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.