Jest возвращает "Network Error" при выполнении аутентифицированного запроса с помощью axios

Мне это кажется немного странным. Я пытаюсь проверить реальную (т.е. Реальную сеть) запрос с помощью Jest.

Это проверенные сценарии:

  • Проверьте внешний API (fixer.io) без заголовков <--- Это работает
  • Тестирование локального сервера API с заголовками <--- Это НЕ работает
  • Тестируйте тот же локальный API с заголовками от node терминала <--- Это работает

Что может быть причиной такого поведения? И какое решение?

//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) )

Ответ 1

Это смешно, что аксиомы использовали XMLHttpRequest первичными, а запрос ajax не может получить доступ к домену, поэтому ваш тест не удался, поэтому вы можете передать свой код, установив адаптер axios.

Причина по 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;
 }

Переход с аксиомом на изменение решения на 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);
});

Решение изменить jest testURL в package.json

"jest": {
   "testURL":"http://192.168.1.253"
}

то тест может быть доступен через http через 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);
    });

Ответ 3

Jest позволяет вам установить файл сценария установки. Этот файл потребуется перед всем остальным и дает вам возможность изменить среду, в которой будут выполняться тесты. Таким образом, вы можете отключить XMLHttpRequest до загрузки аксиомов и оценить тип адаптера с момента подъема импорта. https://facebook.github.io/jest/docs/configuration.html#setuptestframeworkscriptfile-string

Это сработало для меня:

package.json

{
  ...,
  "jest": {
    ...,
    "setupTestFrameworkScriptFile": "./__tests__/setup.js",
    ...
  },
  ...
}

__tests __/setup.js

global.XMLHttpRequest = undefined;