これは少し奇妙に思えます。 Jestで実際の(つまり、実際のネットワーク)リクエストをテストしようとしています。
テストされたシナリオは次のとおりです。
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) )
それは面白いです、axiosはプライマリによってXMLHttpRequestを使用し、ajaxリクエストはドメインを越えてアクセスできないため、テストが失敗したので、axiosアダプタを設定してコードを渡すことができます。
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;
}
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":"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);
});
Jest構成の問題である可能性があります。 package.jsonで「ノード」をjest環境として強制することを解決しました。
「jest」:{「testEnvironment」:「ノード」}
ドキュメントを参照してください: https://facebook.github.io/jest/docs/configuration.html#testenvironment-string
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;
追加して解決しました
axios.defaults.adapter = require('axios/lib/adapters/http');
特定のテストケースファイルの場合、global.XMLHttpRequest = undefinedまたはenv = nodeを設定すると、他のテストケースが失敗します。