无法在Typescript中模拟axios实例

时间:2018-10-12 07:23:57

标签: reactjs typescript jestjs enzyme

this link之后,我尝试在模拟Axios(使用Typescript)时编写单元测试。

使用Axios实例设置baseUrl

// src/infrastructure/axios-firebase.ts
import axios from 'axios';

const axiosThroughFirebase = axios.create({
    baseURL: 'firebase_URL'
});

export default axiosThroughFirebase;

这是我要测试的组件的简化版本。

// src/container/MainContainer/MainContainer.tsx
import axios_firebase from '../../infrastructure/axios-firebase';
...

public componentDidMount() {
    axios_firebase.get('firebase_url/data.json')
       .then(resp => this.setState({ stuff }));
}

然后是我的测试文件。

// src/container/MainContainer/MainContainer.test.tsx
jest.mock('../../infrastructure/axios-firebase', () => {
    return {
       get: jest.fn(() => Promise.resolve(someFakeData))
    };
});

import axios_firebase from '../../infrastructure/axios-firebase';

test('fetches data on componentDidMount', async () => {
    const wrapper = enzyme.shallow(<MainContainer />);
    wrapper.instance().componentDidMount()
       .then(() => {
           expect(axios_firebase.get).toHaveBeenCalled();
       });
});

运行此测试时,收到以下失败消息:

● MainContainer › encountered a declaration exception

TypeError: Cannot read property 'get' of undefined

  14 |
  15 |     public componentDidMount() {
> 16 |         axios_firebase.get('url_to_data')

我以为我完全在关注初始链接。.我无法想象使用Typescript是问题吗?我看不到为什么在代码中未定义被模拟的Axios实例。

1 个答案:

答案 0 :(得分:1)

与Typescript导入/导出有关。

我认为您应该模拟默认导出。因此,而不是

jest.mock('../../infrastructure/axios-firebase', () => {
    return {
       get: jest.fn(() => Promise.resolve(someFakeData))
    };
});

应该是

jest.mock('../../infrastructure/axios-firebase', () => {
    return {
       'default' : {
         get: jest.fn(() => Promise.resolve(someFakeData))
       }
    };
});

请参见https://github.com/kulshekhar/ts-jest/issues/120#issuecomment-283653644