Mock inner axios.create()

前端 未结 2 500
面向向阳花
面向向阳花 2020-11-30 07:43

I\'m using jest and axios-mock-adapter to test axios API calls in redux async action creators.

I can\'t make the

相关标签:
2条回答
  • 2020-11-30 08:18

    In your mockAdapter, you're mocking the wrong instance. You should have mocked ajax instead. like this, const mock = MockAdapter(ajax) This is because you are now not mocking the axios instance but rather the ajax because it's the one you're using to send the request, ie, you created an axios instance called ajax when you did export const ajax = axios.create...so since you're doing const result = await ajax.post in your code, its that ajax instance of axios that should be mocked, not axios in that case.

    0 讨论(0)
  • 2020-11-30 08:19

    OK I got it. Here is how I fixed it! I ended up doing without any mocking libraries for axios!

    Create a mock for axios in 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
    

    Then in your test file, the gist would look like:

    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)
    })
    
    0 讨论(0)
提交回复
热议问题