web-dev-qa-db-ja.com

内部のaxios.create()のモック

jest非同期アクションクリエーターでaxios AP​​I呼び出しをテストするためにreduxおよび_axios-mock-adapter_を使用しています。

そのようなaxios.create()で作成されたaxiosインスタンスを使用している場合、それらを機能させることができません。

_import axios from 'axios';

const { REACT_APP_BASE_URL } = process.env;

export const ajax = axios.create({
  baseURL: REACT_APP_BASE_URL,
});
_

私はそれを私の_async action creator_のように消費します:

_import { ajax } from '../../api/Ajax'

export function reportGet(data) {
  return async (dispatch, getState) => {
    dispatch({ type: REQUEST_TRANSACTION_DATA })

    try {
      const result = await ajax.post(
         END_POINT_MERCHANT_TRANSACTIONS_GET,
         data,
      )
      dispatch({ type: RECEIVE_TRANSACTION_DATA, data: result.data })
      return result.data
    } catch (e) {
      throw new Error(e);
    }
  }
}
_

これが私のテストファイルです:

_import {
  reportGet,
  REQUEST_TRANSACTION_DATA,
  RECEIVE_TRANSACTION_DATA,
} from '../redux/TransactionRedux'
import configureMockStore from 'redux-mock-store'
import thunk from 'redux-thunk'
import { END_POINT_MERCHANT_TRANSACTIONS_GET } from 'src/utils/apiHandler'
import axios from 'axios'
import MockAdapter from 'axios-mock-adapter'

const middlewares = [thunk]
const mockStore = configureMockStore(middlewares)
const store = mockStore({ transactions: {} })

test('get report data', async () => {
  let mock = new MockAdapter(axios)

  const mockData = {
    totalSalesAmount: 0
  }

  mock.onPost(END_POINT_MERCHANT_TRANSACTIONS_GET).reply(200, mockData)

  const expectedActions = [
    { type: REQUEST_TRANSACTION_DATA },
    { type: RECEIVE_TRANSACTION_DATA, data: mockData },
  ]

  await store.dispatch(reportGet())
  expect(store.getActions()).toEqual(expectedActions)
})
_

また、_Received: [{"type": "REQUEST_TRANSACTION_DATA"}]_でエラーが発生したため、_ajax.post_のアクションは1つしか取得できません。

私は何をしているのか本当にわからないまま_axios.create_をあざけるために多くの方法を試してみました。

10
kyw

はい、分かりました。これが私が修正した方法です!私は最終的になしaxiosのモックライブラリを実行しました!

src/__mocks__axiosのモックを作成します。

// 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)
})
24
kyw

MockAdapterで、間違ったインスタンスをモックしています。代わりにajaxをモックする必要があります。これは、const mock = MockAdapter(ajax)です。これは、axiosインスタンスをモックしていないためです。ajaxは、リクエストの送信に使用しているためです。つまり、ajaxと呼ばれるaxiosインスタンスを作成したためです。 export const ajax = axios.create...soコードでconst result = await ajax.postを実行しているので、モックする必要があるaxiosのajaxインスタンスであり、その場合はaxiosではありません。

0
Richard