1. ホーム
  2. reactjs

[解決済み] axios-mock-adapter onGet mock data not effective.

2022-02-16 05:27:27

質問

axios-mock-adapterでaxiosの呼び出しをテストしようとしています。以下の問題が発生しました。 テスト用のAPIコールは、mock.onGetでモックしたものではなく、常に実際のデータで応答します。 つまり、receivedActionsは常に本物のAPIコールから返されますが、mock.onGetでモック化したexpectedActionsは返されません。 以下は、そのアクションのコード(searchAction.js)です。

import { SEARCH_PHOTOS, FEATURED_PHOTOS } from './types';
import axiosInstence from '../apis/axiosInstence';

export const searchPhotos = (term) => (dispatch) => {
  dispatch({ type: 'SEACH_REQUEST' });

  return axiosInstence.get('/search/photos', {
    params: {
      query: term,
      page: 1
    }
  }).then(response => {
    dispatch({
      type: 'SEARCH_PHOTOS',
      payload: response.data
    });
  }).catch(error => {
    dispatch({ type: 'SEACH_FAILURE' });
  });
}

そして、私のテストは次のようになります(searchAction.test.js)。

import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import thunk from 'redux-thunk';
import configureMockStore from 'redux-mock-store';
import { searchPhotos } from '../searchAction';

const mock = new MockAdapter(axios);

const middlewares = [thunk];
const mockStore = configureMockStore(middlewares);
const term = 'cars';
const store = mockStore({});

describe('actions', () => {
  beforeEach(() => {
    mock.reset();
    store.clearActions();
  });

  it('Should create an action to signIn with a fake user', async () => {
    const expectedActions = [{
      type: 'SEACH_REQUEST'
    }, {
      type: 'SEARCH_PHOTOS',
      payload: []
    }];

    mock.onGet('/search/photos', {
      params: { term: 'cars' }
    }).reply(200, expectedActions);

    await store.dispatch(searchPhotos(term))
      .then(data => {
        const receivedActions = store.getActions();
        expect(receivedActions).toEqual(expectedActions);
      });
  });
});

どなたか同じような問題を経験された方、またはアドバイスをお願いします。 アドバイスありがとうございます。

解決方法を教えてください。

あなたのコードには、いくつかの問題があります。

まず アクションの作成では、axios インスタンスを使用して ajax 呼び出しを行っていますが、テストでは、そのインスタンスを axios-mock-adapter . のインスタンスを作成するときに、アクシオスのインスタンスを提供する必要があります。 MockAdapter .

第二 は、その params プロパティで、axios モックに提供しています。 onGet メソッドで送信されるパラメータと一致しません。 get の操作をアクションクリエイターで行うことができます。呼び出しのパラメータとその値を一致させる必要があります。したがって querypage パラメータを指定します。

最後の を返すのであれば expectedActions をモック・リクエストで使用することはできますが、これは正しいとは言えません。あなたのコードを見ると、空の配列を返したいようです。

これらを考慮すると、あなたのコードは次のようになります。

import MockAdapter from 'axios-mock-adapter';
import thunk from 'redux-thunk';
import configureMockStore from 'redux-mock-store';

import axiosInstence from '../../apis/axiosInstence';
import { searchPhotos } from '../searchAction';

const mock = new MockAdapter(axiosInstence);

const middlewares = [thunk];
const mockStore = configureMockStore(middlewares);
const term = 'cars';
const store = mockStore({});

describe('actions', () => {
    beforeEach(() => {
        mock.reset();
        store.clearActions();
    });

    it('Should create an action to signIn with a fake user', async () => {
        const expectedActions = [{
            type: 'SEACH_REQUEST'
        }, {
            type: 'SEARCH_PHOTOS',
            payload: []
        }];

        mock.onGet('/search/photos', {
            params: {
                query: 'cars',
                page: 1
            }
        }).reply(200, []);

        const data = await store.dispatch(searchPhotos(term));
        const receivedActions = store.getActions();
        expect(receivedActions).toEqual(expectedActions);
    });
});