在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实例。
答案 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。