1) Извлеките вызов API в другом методе, который возвращает обещание (например, fetchCities ()) для простоты тестирования.
2) Смоделируйте модуль узла axios с помощью Jest.См. Документы: https://jestjs.io/docs/en/mock-functions#mocking-modules
3) Используйте Enzyme, чтобы получить ссылку на ваш компонент: https://airbnb.io/enzyme/docs/api/ShallowWrapper/shallow.html
Как только это будет на месте, вы можете проверить, правильно ли установлено состояние.Например:
test('should fetch users', () => {
const wrapper = shallow(<Home/>);
const resp = {data: [{cities: ['NY']}]};
axios.get.mockResolvedValue(resp);
wrapper.instance().fetchCities().then(resp => {
expect(wrapper.state('cities')).toEqual(resp.data.cities);
});
});
Как мне улучшить этот ответ?Это не то, что я ожидаю в качестве ответа, которое является названием города.
axios.js (отдельная функция для обещания)
'use strict';
module.exports = {
get: () => {
return Promise.resolve({
data: [
{
id: 0,
name: 'Santa Clara'
},
{
id: 1,
name: 'Fremont'
}
]
});
}
};
Home.test.js (фактический тестовый файл)
import React from 'react';
import { shallow,configure } from 'enzyme';
import Home from './Home';
import axios from 'axios';
import Adapter from 'enzyme-adapter-react-16';
configure({adapter:new Adapter()});
jest.mock('axios');
describe('Home component', () => {
describe('when rendered', () => {
it('should fetch a list of cities', () => {
const getSpy = jest.spyOn(axios, 'get');
const cityInstance = shallow(
<Home/>
);
expect(getSpy).toBeCalled();
});
});
});