Javascript (0,_axios.default)在使用拦截器模拟axios时不是函数
我的应用程序有一个文件,它创建了一个带有拦截器的axios实例,然后api使用该实例进行调用。问题是,当我尝试为此api编写测试时,它失败了,并且Javascript (0,_axios.default)在使用拦截器模拟axios时不是函数,javascript,node.js,jestjs,axios,Javascript,Node.js,Jestjs,Axios,我的应用程序有一个文件,它创建了一个带有拦截器的axios实例,然后api使用该实例进行调用。问题是,当我尝试为此api编写测试时,它失败了,并且TypeError:(0,_axios.default)不是一个函数错误 下面是创建axios实例的poc: const axiosInstance = axios.create({ timeout: 20000, paramsSerializer(params) { return qs.stringify(params, { indi
TypeError:(0,_axios.default)不是一个函数错误
下面是创建axios实例的poc:
const axiosInstance = axios.create({
timeout: 20000,
paramsSerializer(params) {
return qs.stringify(params, { indices: false });
},
});
axiosInstance.interceptors.request.use((config) => {
if (process.env.NODE_ENV === 'development') {
logger.info(`Request sent to ${config.url}`, config.params);
}
return config;
}, (error) => Promise.reject(error));
axiosInstance.interceptors.response.use((response) => {
if (process.env.NODE_ENV === 'development') {
logger.info(`Response from ${response.config.url}`, response.data);
}
return parseBody(response);
}, (error) => parseError(error));
export default axiosInstance;
这是使用axios实例的api
const triviaAPI = {
getQuestions: async (amount) => axiosInstance({
method: 'get',
url: 'https://opentdb.com/api.php',
params: {
amount,
},
}).then((response) => response.results)
.catch((error) => {
throw error;
}),
};
export default triviaAPI;
这是axios模拟
import mockAxios from 'jest-mock-axios';
export default {
...mockAxios,
...{
create: jest.fn(() => ({
...mockAxios,
defaults: {
headers: {
common: {},
},
},
interceptors: {
request: {
use: jest.fn(),
},
response: {
use: jest.fn(),
},
},
get: jest.fn(() => Promise.resolve({ data: { total_payout: 100.21 } })),
})),
},
};
最后,这是测试用例
describe('triviaAPI', () => {
it('should return a successful response', async () => {
const data = await triviaAPI.getQuestions(10);
console.log(data);
expect(Array.isArray(data)).toBe(true);
});
});
当我运行测试时,我得到以下错误
我到处找了很多,但还没有找到解决办法。请帮忙 它可能无法工作的原因是,您正在使用nodejs中默认不支持的export
,但是您可以使用参考的实验node.js功能启用它,但不建议使用,因此我建议使用
因此,对于您的用例:
package.json:
{
"name": "axios-test",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"test": "node -r esm ." //Important
},
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^0.19.2",
"esm": "^3.2.25" //Important
}
}
import axios from "axios" //Important
const axiosInstance = axios.create({
timeout: 20000,
paramsSerializer(params) {
return JSON.stringify(params, { indices: false });
},
});
axiosInstance.interceptors.request.use((config) => {
if (process.env.NODE_ENV === 'development') {
logger.info(`Request sent to ${config.url}`, config.params);
}
return config;
}, (error) => Promise.reject(error));
axiosInstance.interceptors.response.use((response) => {
if (process.env.NODE_ENV === 'development') {
logger.info(`Response from ${response.config.url}`, response.data);
}
return response;
}, (error) => Promise.reject(error));
export default axiosInstance; //Important
import axiosInstance from "./axiosInstance.js" //Important
const triviaAPI = {
getQuestions: async (amount) => axiosInstance({
method: 'get',
url: 'https://opentdb.com/api.php',
params: {
amount,
},
}).then((response) => response.results)
.catch((error) => {
throw error;
}),
};
async function main() {
const data = await triviaAPI.getQuestions(10);
console.log(data);
}
main()
axiosInstance.js:
{
"name": "axios-test",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"test": "node -r esm ." //Important
},
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^0.19.2",
"esm": "^3.2.25" //Important
}
}
import axios from "axios" //Important
const axiosInstance = axios.create({
timeout: 20000,
paramsSerializer(params) {
return JSON.stringify(params, { indices: false });
},
});
axiosInstance.interceptors.request.use((config) => {
if (process.env.NODE_ENV === 'development') {
logger.info(`Request sent to ${config.url}`, config.params);
}
return config;
}, (error) => Promise.reject(error));
axiosInstance.interceptors.response.use((response) => {
if (process.env.NODE_ENV === 'development') {
logger.info(`Response from ${response.config.url}`, response.data);
}
return response;
}, (error) => Promise.reject(error));
export default axiosInstance; //Important
import axiosInstance from "./axiosInstance.js" //Important
const triviaAPI = {
getQuestions: async (amount) => axiosInstance({
method: 'get',
url: 'https://opentdb.com/api.php',
params: {
amount,
},
}).then((response) => response.results)
.catch((error) => {
throw error;
}),
};
async function main() {
const data = await triviaAPI.getQuestions(10);
console.log(data);
}
main()
main.js:
{
"name": "axios-test",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"test": "node -r esm ." //Important
},
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^0.19.2",
"esm": "^3.2.25" //Important
}
}
import axios from "axios" //Important
const axiosInstance = axios.create({
timeout: 20000,
paramsSerializer(params) {
return JSON.stringify(params, { indices: false });
},
});
axiosInstance.interceptors.request.use((config) => {
if (process.env.NODE_ENV === 'development') {
logger.info(`Request sent to ${config.url}`, config.params);
}
return config;
}, (error) => Promise.reject(error));
axiosInstance.interceptors.response.use((response) => {
if (process.env.NODE_ENV === 'development') {
logger.info(`Response from ${response.config.url}`, response.data);
}
return response;
}, (error) => Promise.reject(error));
export default axiosInstance; //Important
import axiosInstance from "./axiosInstance.js" //Important
const triviaAPI = {
getQuestions: async (amount) => axiosInstance({
method: 'get',
url: 'https://opentdb.com/api.php',
params: {
amount,
},
}).then((response) => response.results)
.catch((error) => {
throw error;
}),
};
async function main() {
const data = await triviaAPI.getQuestions(10);
console.log(data);
}
main()
注意:我的axiosInstance.mjs中的一些代码被更改,因为问题不包括它们是什么,所以我用//重要的
另外:如果您想查看使用实验功能的示例,请检查此答案的编辑历史记录。我欣赏答案,但问题是测试用例不工作,axis实例在所有调用中都可以正常工作。我需要修复模拟部分。我不能100%确定你的意思,因为在屏幕截图中导致错误的那一行现在可以与我当前所做的更改一起工作响应的输出。结果是未定义的,因为API不会返回任何数据。但是,如果我执行响应
操作,我会得到一个控制台日志,其中包含有关请求的所有信息。控制台日志:我很抱歉不清楚,但我面临的问题是,当我运行测试用例“descripe('triviaAPI',()=>{it('should return a successful response',async()=>{const data=wait triviaAPI.getQuestions(10);Console.log(data);expect(Array.isArray(data)).toBe(true);};“`问题中也提到了测试用例