web-dev-qa-db-ja.com

Jestは、axiosで認証されたリクエストを行うと「ネットワークエラー」を返します

これは少し奇妙に思えます。 Jestで実際の(つまり、実際のネットワーク)リクエストをテストしようとしています。

テストされたシナリオは次のとおりです。

  • ヘッダーなしで外部API(fixer.io)をテストします<--- This works
  • ヘッダーを使用してローカルAPIサーバーをテストします<---これは機能しません
  • node端子からのヘッダーで同じローカルAPIをテストします<---これは動作します

この動作の背後にある理由は何でしょうか?そして、解決策は何ですか?

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

それは面白いです、axiosはプライマリによって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;
 }

解決策axiosアダプタを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);
});

Package.jsonのjest testURLを変更するソリューション

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

テストはajax経由でhttpにアクセスできます

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);
    });
18
holi-java

Jest構成の問題である可能性があります。 package.jsonで「ノード」をjest環境として強制することを解決しました。

「jest」:{「testEnvironment」:「ノード」}

ドキュメントを参照してください: https://facebook.github.io/jest/docs/configuration.html#testenvironment-string

33

Jestでは、セットアップスクリプトファイルを設定できます。このファイルは他のすべての前に必要であり、テストを実行する環境を変更する機会を与えます。これにより、インポートがホイストされるため、axiosがロードされ、アダプタータイプが評価される前にXMLHttpRequestを設定解除できます。 https://facebook.github.io/jest/docs/configuration.html#setuptestframeworkscriptfile-string

これは私のために働いた:

package.json

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

__ tests __/setup.js

global.XMLHttpRequest = undefined;
21
chris

追加して解決しました

axios.defaults.adapter = require('axios/lib/adapters/http');

特定のテストケースファイルの場合、global.XMLHttpRequest = undefinedまたはenv = nodeを設定すると、他のテストケースが失敗します。

1
Ashish Sharma