Jest在使用axios进行身份验证请求时返回“Network Error

8nuwlpux  于 2023-01-17  发布在  iOS
关注(0)|答案(5)|浏览(271)

这对我来说似乎有点奇怪。我试图用Jest测试一个实际的(即真实的网络)请求。
以下是经过测试的场景:

  • 测试一个没有头文件的外部API(fixer.io)〈---这可以工作
  • 测试带有标头的本地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) )
uklbhaso

uklbhaso1#

这可能是一个Jest配置问题。我解决了在package.json中强制“node”作为jest环境的问题:
“笑话”:{“测试环境”:“节点”}
参见文档:https://facebook.github.io/jest/docs/configuration.html#testenvironment-string

ifsvaxew

ifsvaxew2#

有趣的是,axios通过primary使用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测试URL

"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);
    });
42fyovps

42fyovps3#

Jest允许你设置一个安装脚本文件。这个文件在其他任何事情之前都是必需的,并且让你有机会修改测试运行的环境。这样你就可以在axios加载之前取消XMLHttpRequest的设置,并且在导入被提升之后评估适配器类型。www.example.comhttps://facebook.github.io/jest/docs/configuration.html#setuptestframeworkscriptfile-string
这对我很有效:

    • 包. json**
{
  ...,
  "jest": {
    ...,
    "setupTestFrameworkScriptFile": "./__tests__/setup.js",
    ...
  },
  ...
}
  • 测试/设置. js*
global.XMLHttpRequest = undefined;
o0lyfsai

o0lyfsai4#

我通过添加以下内容解决了这个问题

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

对于特定的测试用例文件,设置global.XMLHttpRequest = undefined或env=node会导致其他测试用例失败。

mjqavswn

mjqavswn5#

我在Next.js项目上工作,在那里我有前端和后端测试,将testEnvironment设置为"node"不起作用。
我将jest.config.js配置为

testEnvironment: 'jest-environment-jsdom',

并添加了

/**
 * @jest-environment node
 */

所有后端测试。

相关问题