javascript - domain - URL relativa como nombre de host en Nock
title js (5)
Acabo de hacer una pregunta similar en el repositorio de Nock. Aparentemente esto no es compatible: https://github.com/pgte/nock/issues/431
Necesito simular las solicitudes HTTP del lado del cliente. Estoy usando isomorphic-fetch
en el lado del cliente y estoy usando mocha
y nock
para probar y burlarse. Todas mis solicitudes de cliente se basan en la ruta relativa. Debido a esto no puedo proporcionar el nombre de host para el nock
. ¿Hay algún trabajo alrededor?
Lado del cliente:
fetch(''/foo'') //hostname: http://localhost:8080
.then(res => res.json())
.then(data => console.log(data))
.catch(e => console.log(e))
Banco de pruebas
nock(''/'')
.get(''/foo'')
.reply(200, {data: "hello"})
Esto está fallando porque no estoy dando el nombre de host adecuado para el nock
. ¿Estoy haciendo algo mal?
Encontré una solución para esto. Tenga un _ajax-setup.js
en su carpeta de prueba
import $ from ''jquery''
$(document).ajaxSend((event, jqxhr, settings) => {
settings.url = ''http://0.0.0.0'' + settings.url;
})
Lo que hay que tener en cuenta es que este archivo debe ejecutarse primero y solo una vez . Tenerlo como un archivo solo se ejecuta una vez y _
antes de que lo haga alfabéticamente primero.
Más tarde puedes probar tu código con
nock(''http://0.0.0.0'')
.get(''/foo'')
.reply(200, {data: "hello"})
La respuesta de kudresov a la pregunta de liorbauer describe una solución específica de Jest.
Pon esto en __mocks __ / isomorphic-fetch.js:
const fetch = require.requireActual(''isomorphic-fetch'');
module.exports = (url, config) => {
return fetch(''https://localhost'' + url, config);
};
Luego, Jest reemplaza automáticamente todos los requisitos (o importaciones) para este módulo de nodo.
En otros marcos de prueba podrías usar algo como rewire
Para axios agregué los siguientes a mi archivo de prueba. Esto ayudó a superar esta limitación.
axios.defaults.baseURL=''http://localhost:4000/'';
Tenga en cuenta que esta es una variable global. Con esto, el código real puede vivir con una URL relativa y no es necesario verificar el indicador de prueba en él.
Para cualquier persona interesada: en mi proyecto de reacción / webpack, resolví esto antes de ir a buscar url con '' http: // localhost '' cuando NODE_ENV
está configurado como ''test''
.
ejemplo:
const testing = process.env.NODE_ENV === ''test'';
const apiUrl = `${testing ? ''http://localhost'' : ''''}/api`;
function getStuffFromApi() {
return fetch(apiUrl, ...)
}
De esta manera, en mi prueba siempre puedo usar nock así:
nock(''http://localhost'')
.get(''/api'')
.reply(200, {data: ''hello''})
NOTA : Al ejecutar mis pruebas, NODE_ENV se establece en ''probar''