javascript - Jest devuelve "Error de red" al realizar una solicitud autenticada con axios
testing ecmascript-6 (3)
Es gracioso, que los axios usaron XMLHttpRequest por el primario, y la solicitud ajax no puede acceder a través del dominio, por lo que su prueba falló, así que puede dejar que su código pase configurando el adaptador de axios.
La razón por axios / defaults.js
function getDefaultAdapter() {
var adapter;
if (typeof XMLHttpRequest !== ''undefined'') {
// For browsers use XHR adapter
adapter = require(''./adapters/xhr'');
} else if (typeof process !== ''undefined'') {
// For node use HTTP adapter
adapter = require(''./adapters/http'');
}
return adapter;
}
Adaptador de axios de cambio de solución a http
import axios from ''axios'';
//This WORKS
test(''testing with headers'', (done) => {
var path=require(''path'');
var lib=path.join(path.dirname(require.resolve(''axios'')),''lib/adapters/http'');
var http=require(lib);
axios.get(''http://192.168.1.253'', {
adapter: http,
headers: {
Authorization: "Basic YWRtaW46bHVveGlueGlhbjkx"
}
}).then((res) => {
expect(res.status).toBe(200);
done();
}).catch(done.fail);
});
Solución de cambio jest testURL en package.json
"jest": {
"testURL":"http://192.168.1.253"
}
entonces la prueba se puede acceder a http via ajax
import axios from ''axios'';
//This WORKS
test(''testing with headers'', (done) => {
axios.get(''http://192.168.1.253'', {
headers: {
Authorization: "Basic YWRtaW46bHVveGlueGlhbjkx"
}
}).then((res) => {
expect(res.status).toBe(200);
done();
}).catch(done.fail);
});
Esto me parece un poco raro. Estoy intentando probar una solicitud real (es decir, una red real) con Jest.
Estos son los escenarios probados:
- Pruebe una API externa (fixer.io) sin encabezados <--- Esto funciona
- Probar un servidor de API local con encabezados <--- Esto NO funciona
- Pruebe la misma API local con encabezados desde el terminal del
node
<--- Esto funciona
¿Cuál podría ser la razón detrás de este comportamiento? y cual es la solución?
//This WORKS
test(''testing no headers'', () => {
return axios.get(''http://api.fixer.io/latest'')
.then( res => console.log(res) )
});
//This DOES NOT work
test(''testing no headers'', () => {
return axios.get(''http://localhost:3000/users/4/profile'',
{headers:{authorization:`Bearer ${mytoken}`}})
.then( res => console.log(res) )
});
//...
//Node Terminal
//This WORKS
> axios.get(''http://localhost:3000/users/4/profile'',
{headers:{authorization:`Bearer ${mytoken}`}})
.then( res => console.log(res) )
Jest le permite establecer un archivo de script de configuración. Este archivo será necesario antes que todo lo demás y le brinda la oportunidad de modificar el entorno en el que se ejecutarán las pruebas. De esta manera, puede desactivar XMLHttpRequest antes de cargar los axios y evaluar el tipo de adaptador desde que se elevaron las importaciones. https://facebook.github.io/jest/docs/configuration.html#setuptestframeworkscriptfile-string
Esto funcionó para mí:
paquete.json
{
...,
"jest": {
...,
"setupTestFrameworkScriptFile": "./__tests__/setup.js",
...
},
...
}
__tests __ / setup.js
global.XMLHttpRequest = undefined;
Puede ser un problema de configuración Jest. Resolví forzando "nodo" como entorno jest en package.json:
"jest": {"testEnvironment": "node"}
ver documentos: https://facebook.github.io/jest/docs/configuration.html#testenvironment-string