Тестирование редукционного действия - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь реализовать шутку с нашими редукционными действиями.Учитывая приведенное ниже действие foo и его следующий тест, следующий тест не пройден, потому что store.getActions() возвращает мне только [{"type": "ACTION_ONE"}], как предполагается, [{"type": "ACTION_ONE"}, {"type": "ACTION_TWO"}].Как получить оба отправленных действия при тестировании?Спасибо!

import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';

export const foo = () => {
  return (dispatch) => {
    dispatch(actionOne());
    return HttpService.get(`api/sampleUrl`)
      .then(json => dispatch(actionTwo(json.data)))
      .catch(error => handleError(error));
  };
};

const middlewares = [thunk];
const mockStore = configureMockStore(middlewares);

beforeEach(() => {
  store = mockStore({});
});

describe('sample test', () => {
  test('validates foo complex action', () => {
    const expectedActions = [
      {type: actionTypes.ACTION_ONE},
      {type: actionTypes.ACTION_TWO},
    ];

    return store.dispatch(actions.foo())
      .then(() => {
        expect(store.getActions())
          .toEqual(expectedActions);
      });
  });
});

1 Ответ

0 голосов
/ 19 февраля 2019

Вы не издевались над вызовом API, и, поскольку без насмешки он не будет успешным, действие, отправляемое при разрешении обещания, не запускается.Вы можете использовать fetchMock для насмешки вызова API.Как только вы сделаете это правильно, ваш тест будет работать

import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';
import fetchMock from 'fetch-mock';
import fetch from 'node-fetch';

export const foo = () => {
  return (dispatch) => {
    dispatch(actionOne());
    return fetch(`api/sampleUrl`)
      .then(r => r.json())
      .then(json => dispatch(actionTwo(json)))
      .catch(error => handleError(error));
  };
};

const middlewares = [thunk];
const mockStore = configureMockStore(middlewares);

beforeEach(() => {
  store = mockStore({});
  fetchMock.restore()
});

describe('sample test', () => {
  test('validates foo complex action', () => {

    fetchMock.getOnce('api/sampleUrl', {
      body: { sample: ['do something'] }
    })

    const expectedActions = [
      {type: actionTypes.ACTION_ONE},
      {type: actionTypes.ACTION_TWO},
    ];

    return store.dispatch(actions.foo())
      .then(() => {
        expect(store.getActions())
          .toEqual(expectedActions);
      });
  });
});
...