I have following function.
const loadUsers= () => { return async (dispatch) => { dispatch(userRequest()); let response= null try { response= await UserService.getUser(); dispatch(userLoading()); } catch (error) { dispatch(userError(error)); } finally { dispatch(userSuccess(response)); } }; };
With the following unit test I was abale to hit the “dispatch(userRequest());”
describe('user thunk', () => { it('dispatches a userRequest', async () => { const dispatch = jest.fn(); await loadUsers()(dispatch); expect(dispatch).toHaveBeenCalledWith(userRequest()); }); });
However I couldn’t figure out how to test lines and below response= await UserService.getUser();
. Even though the function is not complex and I won’t have much value for writing complex test, I need it for my pipeline to build.
Any help will be appreciated.
Thanks in advance.
UPDATE-> User Service
import axios from 'axios'; const USERS_ENDPOINT = '/user'; export const getUser= async () => { const response = await axios.get(PRODUCTS_ENDPOINT, {}); return response.data; }; export default getUser;
Advertisement
Answer
After days of research, I ended up testing the logic the following way.
import thunk from 'redux-thunk'; import configureStore from 'redux-mock-store'; import * as reactRedux from 'react-redux'; import axios from 'axios'; const middlewares = [thunk]; const mockStore = configureStore(middlewares); describe('load user thunk', () => { it('dispatches load user and error on call when API is not mocked', async () => { const store = mockStore({}); const requestDispatch= userRequest(); const errorDispatch= userError("Mock Message"); await store.dispatch(await loadUsers()); const actionsResulted = store.getActions(); const expectedActions = [ requestDispatch, errorDispatch, ]; expect(actionsResulted.length).toEqual(expectedActions.length); expect(actionsResulted[0].type).toEqual(expectedActions[0].type); expect(actionsResulted[1].type).toEqual(expectedActions[1].type); }); it('dispatches load user and success on call when API is mocked', async () => { const store = mockStore({}); const requestDispatch= userRequest(); const successDispatch= userSuccess("Mock Data"); jest .spyOn(axios, 'get') .mockResolvedValue({ status: 200, data: "Mock Data"}); await store.dispatch(await loadUsers()); const actionsResulted = store.getActions(); const expectedActions = [ requestDispatch, successDispatch, ]; expect(actionsResulted.length).toEqual(expectedActions.length); expect(actionsResulted[0].type).toEqual(expectedActions[0].type); expect(actionsResulted[1].type).toEqual(expectedActions[1].type); });