Напишите тестовый axios-mock-адаптер с помощью axios.create()
Я хочу проверить мой http сервис, но получаю ошибку. Итак, мой тестовый файл
api.js
import axios from 'axios';
export const api = axios.create();
fetchUsers.js
import api from './api';
export const fetchUsers = (params) api.get('/api/users', { params })
.then(({data}) => data)
fetchUsers.spec.js
import MockAdapter from 'axios-mock-adapter'
import api from './api';
const mock = new MockAdapter(api);
describe('fetchUsers', () => {
it('should send request', (done) => {
const data = { data: ['user'] };
mock.onGet('/api/users').reply(200, data);
fetchUsers().then((response) => {
expect(response).toEqual(data.data);
done();
});
});
});
Но я получаю ошибку здесь
Ошибка: подключите ECONNREFUSED 127.0.0.1:80 в TCPConnectWrap.afterConnect [as oncomplete] (net.js:1158:14)
Если я заменим в api.js axios.create() на axios, то он будет работать. Но как протестировать созданный экземпляр axios? Мне нужно будет задавать там параметры при создании.
Кто-нибудь может помочь с этим?
1 ответ
Привет, у меня была такая же проблема, и мне пришлось самому ответить здесь /questions/37752699/lozhnyij-vnutrennij-axioscreate/37752717#37752717
Вот суть:
Во-первых, вам не нужно axios-mock-adapter
библиотека.
Создать макет для axios
в src/__mocks__
:
// src/__mocks__/axios.ts
const mockAxios = jest.genMockFromModule('axios')
// this is the key to fix the axios.create() undefined error!
mockAxios.create = jest.fn(() => mockAxios)
export default mockAxios
Тогда в вашем тестовом файле суть будет выглядеть так:
import mockAxios from 'axios'
import configureMockStore from 'redux-mock-store'
import thunk from 'redux-thunk'
// for some reason i need this to fix reducer keys undefined errors..
jest.mock('../../store/rootStore.ts')
// you need the 'async'!
test('Retrieve transaction data based on a date range', async () => {
const middlewares = [thunk]
const mockStore = configureMockStore(middlewares)
const store = mockStore()
const mockData = {
'data': 123
}
/**
* SETUP
* This is where you override the 'post' method of your mocked axios and return
* mocked data in an appropriate data structure-- {data: YOUR_DATA} -- which
* mirrors the actual API call, in this case, the 'reportGet'
*/
mockAxios.post.mockImplementationOnce(() =>
Promise.resolve({ data: mockData }),
)
const expectedActions = [
{ type: REQUEST_TRANSACTION_DATA },
{ type: RECEIVE_TRANSACTION_DATA, data: mockData },
]
// work
await store.dispatch(reportGet())
// assertions / expects
expect(store.getActions()).toEqual(expectedActions)
expect(mockAxios.post).toHaveBeenCalledTimes(1)
})