Testing dispatched actions in Redux thunk with Jest

前端 未结 4 771
栀梦
栀梦 2020-12-15 07:33

I\'m quite new to Jest and admittedly am no expert at testing async code...

I have a simple Fetch helper I use:

export function fetchHe         


        
4条回答
  •  星月不相逢
    2020-12-15 08:07

    The redux docs have a great article on testing async action creators:

    For async action creators using Redux Thunk or other middleware, it's best to completely mock the Redux store for tests. You can apply the middleware to a mock store using redux-mock-store. You can also use fetch-mock to mock the HTTP requests.

    import configureMockStore from 'redux-mock-store'
    import thunk from 'redux-thunk'
    import * as actions from '../../actions/TodoActions'
    import * as types from '../../constants/ActionTypes'
    import fetchMock from 'fetch-mock'
    import expect from 'expect' // You can use any testing library
    
    const middlewares = [thunk]
    const mockStore = configureMockStore(middlewares)
    
    describe('async actions', () => {
      afterEach(() => {
        fetchMock.reset()
        fetchMock.restore()
      })
    
      it('creates FETCH_TODOS_SUCCESS when fetching todos has been done', () => {
        fetchMock
          .getOnce('/todos', { body: { todos: ['do something'] }, headers: { 'content-type': 'application/json' } })
    
    
        const expectedActions = [
          { type: types.FETCH_TODOS_REQUEST },
          { type: types.FETCH_TODOS_SUCCESS, body: { todos: ['do something'] } }
        ]
        const store = mockStore({ todos: [] })
    
        return store.dispatch(actions.fetchTodos()).then(() => {
          // return of async actions
          expect(store.getActions()).toEqual(expectedActions)
        })
      })
    })
    

    Their approach is not to use jest (or sinon) to spy, but to use a mock store and assert the dispatched actions. This has the advantage of being able to handle thunks dispatching thunks, which can be very difficult to do with spies.

    This is all straight from the docs, but let me know if you want me to create an example for your thunk.

提交回复
热议问题