【问题标题】:TypeError: (0 , _axios.default) is not a function when use jest.mock('axios') inside a *.test.js fileTypeError: (0 , _axios.default) 在 *.test.js 文件中使用 jest.mock('axios') 时不是函数
【发布时间】:2019-10-02 07:06:57
【问题描述】:

我尝试像这样在我的测试文件中模拟 axios 模块

// mycomponent.test.js
import axios from 'axios';

jest.mock('axios', () => ({
  get: jest.fn(() => Promise.resolve({ data: 'data' })),
  default: jest.fn(() => Promise.resolve({ data: 'data' })),
}));

但是在我将jest.mock('axios') 添加到我的测试文件后,我得到了这样的错误。

TypeError: (0 , _axios.default) is not a function

      55 |       this.props.updateGlobalLoading(true);
      56 | 
    > 57 |       axios({
         |       ^
      58 |         method: 'get',
      59 |         url: '/v1/api/portal-xml-list',
      60 |       }).then((res) => {

那么我应该如何解决这个问题,我错过了为axios mocking 设置的任何东西?

谢谢!

【问题讨论】:

    标签: javascript unit-testing mocking jestjs axios


    【解决方案1】:

    如果要模拟模块的默认和命名导出(在本例中为axios),则必须在返回值中启用属性__esModule

    jest.mock('axios', () => ({
        __esModule: true,
        get: jest.fn(() => Promise.resolve({ data: 'data' })),
        default: jest.fn(() => Promise.resolve({ data: 'data' })),
    }));
    

    或者,您似乎只使用axios 的默认导出,您可以将默认导出模拟为:

    jest.mock('axios', () => jest.fn(() => Promise.resolve({ data: 'data' })));
    

    【讨论】:

    • 哇,太棒了。但我不明白为什么使用 jest 中的 requireActual 不会添加它? jest.mock('lib', () => ({ ...jest.requireActual('lib'), otherMEthods }))
    • @mgarcia 如何在另一个测试用例中模拟 axios.default 的 Promise.reject ?
    猜你喜欢
    • 2020-08-31
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 2021-12-03
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多