javascript testing ecmascript-6 axios jestjs

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;