javascript – 当使用axios进行经过身份验证的请求时,Jest返回“网络错误”
作者:互联网
这对我来说似乎有点奇怪.我正在尝试使用Jest测试实际(即真实网络)请求.
这些是经过测试的场景:
>测试没有标题的外部API(fixer.io)< ---这是有效的
>使用标题< ---测试本地API服务器.这不起作用
>使用节点终端的标题测试相同的本地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适配器来让代码通过.
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);
});
标签:axios,javascript,ecmascript-6,testing,jestjs 来源: https://codeday.me/bug/20191004/1852667.html