Модульный тест Redux asyn c действий - PullRequest
0 голосов
/ 01 августа 2020

Это мое асинхронное c действие, которое включает вызовы api и создателей действий

export const getPosts = () => (dispatch) => {
  dispatch({ type: LOADING_DATA });
  axios
    .get(`/posts`)
    .then(res => {
      dispatch({
        type: SET_POSTS,
        payload: res.data
      });
    })
    .catch(err => {
      dispatch({
        type: SET_POSTS,
        payload: []
      });
    });
};

Я тестирую, что при вызове getPosts он отправляет LOADING_DATA, а затем SET_POSTS.

import axios from 'axios';
import moxios from 'moxios';
import expect from 'expect';
import thunk from 'redux-thunk';
import configureMockStore from 'redux-mock-store';
import { getPosts } from '../actions/dataActions';
import { LOADING_DATA, SET_POSTS } from '../actions/actionTypes';

describe('dataActions', () => {
    const middlewares = [thunk];
    const mockStore = configureMockStore(middlewares);

    beforeEach(() => {
        moxios.install();
    });

    // getPosts - when calling LOADING_DATA, we dispatch SET_POSTS with expected payload
    it('should dispatch an action to get posts', () => {
      moxios.wait(() => {
      const request = moxios.requests.mostRecent();
      request.respondWith({
        status: 200
      });
        });

        const expectedActions = [
            { type: LOADING_DATA},
            { type: SET_POSTS}
        ]

        const store = mockStore({ posts: [] })

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

    afterEach(() => {
    moxios.uninstall();
  });
})

Однако я получаю TypeError: Cannot read property 'then' of undefined. Я ценю любую предоставленную помощь.

1 Ответ

1 голос
/ 01 августа 2020

Ваше действие не возвращает никаких обещаний, поэтому вы можете обработать его внутри своего тестового примера, используя then. Вам нужно добавить оператор return к своему действию непосредственно перед вызовом axios.

export const getPosts = () => (dispatch) => {
  dispatch({ type: LOADING_DATA });
  //Just add return statement
  return axios
    .get(`/posts`)
    .then(res => {
      dispatch({
        type: SET_POSTS,
        payload: res.data
      });
    })
    .catch(err => {
      dispatch({
        type: SET_POSTS,
        payload: []
      });
    });
};

У меня была такая же проблема, и я решил ее таким образом!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...