Не могу издеваться над экземпляром axios в Typescript - PullRequest
0 голосов
/ 12 октября 2018

Следуя по этой ссылке , я попытался написать модульный тест при издевании над 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 голосов
/ 12 октября 2018

Что-то связанное с импортом / экспортом 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...