javascript - (0 , _axios.default) 在使用拦截器模拟 axios 时不是函数

标签 javascript node.js jestjs axios

我的应用程序有一个文件,它创建一个带有拦截器的 axios 实例,然后 api 使用这个实例进行调用。问题是当我尝试为这个 api 编写测试时它失败了 TypeError: (0 , _axios.default) is not a function错误。

下面是创建 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);
  });
});

当我运行测试时,出现以下错误
enter image description here

我已经搜索了很多,但还没有找到解决方案。请帮忙!!!

最佳答案

它可能不起作用的原因是因为您使用的是 export默认情况下在 nodejs 中尚不支持,但是您可以使用引用的实验性 node.js 功能启用它 here但是不建议这样做,因此我建议使用 esm

因此,对于您的用例:

包.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
  }
}

axiosInstance.js :
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

main.js :
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 中更改了一些代码,因为问题不包括它们是什么所以我用 //Important 标记了所有相关更改

还有 :如果您想查看使用实验功能的示例,请查看此答案的编辑历史记录。

关于javascript - (0 , _axios.default) 在使用拦截器模拟 axios 时不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61808813/

相关文章:

javascript - 如何触发点击页面加载?

node.js - 网络服务器之上的http服务器

node.js - bcrypt 与 nodejs 比较

javascript - Jest spyOn 函数调用

javascript - 将 .aspx 文件调用到另一个 .aspx 文件中

javascript - jQuery 将按钮的文本更改为单击按钮的文本

javascript - 如何在自定义 Hook 中测试 useEffect?

javascript - 无法在 useEffect 中模拟函数

javascript - 尝试使用下拉选择更新 DOM

node.js - 如何使用elasticsearch-js(或其他方式)根据查询更新文档?