Ошибка тестирования исходного состояния редуктора - PullRequest
0 голосов
/ 10 мая 2018

Я получаю сообщение об ошибке при попытке выполнить базовый тест редуктора, такой как тесты на документах Redx: https://redux.js.org/recipes/writing-tests#reducers

TypeError: Cannot read property 'GROUP_LIST_REQUEST' of undefined

  22 | 
  23 |   switch (action.type) {
> 24 |     case GROUP_LIST_REQUEST:
  25 |       return {
  26 |         ...state,
  27 |         fetching: true,

  at group (app/reducers/group.js:24:10)
  at node_modules/redux/lib/combineReducers.js:53:24
  at Array.forEach (native)
  at assertReducerShape (node_modules/redux/lib/combineReducers.js:51:25)
  at combineReducers (node_modules/redux/lib/combineReducers.js:107:5)
  at Object.<anonymous> (app/reducers/all.js:23:16)
  at Object.<anonymous> (app/store.js:31:1)
  at Object.<anonymous> (app/models/api.js:31:1)
  at Object.<anonymous> (app/actions/group.js:1:1)
  at Object.<anonymous> (app/reducers/group.js:1:1)
  at Object.<anonymous> (__tests__/groups/reducer.js:6:1)

Похоже, что трассировка стека означает, что все приложение работаетзапустить, когда я просто хочу запустить свой метод редуктора изолированно.

Но еще более странно то, что он не может найти мой тип действия в переключателе редуктора, который я даже не использую в тесте.

import reducer from '../../app/reducers/group';
import * as actions from '../../app/actions/group';

describe('group reducer', () => {
  test('should return the initial state', () => {
    expect(reducer(undefined, {})).toEqual({
      selected: null,
      fetching: false,
      fetched: false,
      error: null,
      items: [],
    });
  });
});

Редуктор:

import {
  GROUP_LIST_REQUEST,
  GROUP_LIST_SUCCESS,
  GROUP_LIST_FAILURE,
 } from '../actions/group';

export const initialState = {
  selected: null,
  fetching: false,
  fetched: false,
  error: null,
  items: [],
};

export default function group(state = initialState, action) {
  console.log(action);

  switch (action.type) {
    case GROUP_LIST_REQUEST:
      return {
        ...state,
        fetching: true,
        fetched: false,
      };
    case GROUP_LIST_SUCCESS:
      return {
        ...state,
        fetching: false,
        fetched: true,
        items: action.groupList === undefined ? [] : action.groupList,
      };
    case GROUP_LIST_FAILURE:
      return {
        ...state,
        fetching: false,
        fetched: false,
      };
    default:
      return state;
  }
}

Когда я регистрирую действие, я получаю { type: '@@redux/INIT' }, что странно, потому что для теста я пропускаю пустой объект.

РЕДАКТИРОВАТЬ:Я использую Jest для тестирования, может быть, это связано с конфигами?

1 Ответ

0 голосов
/ 11 мая 2018

Я понял это. Трассировка стека была действительно главной подсказкой. Когда я больше не импортировал свои действия и поместил их прямо в файл редуктора, это решило проблему. Виновником был импорт акций:

import {
  GROUP_LIST_REQUEST,
  GROUP_LIST_SUCCESS,
  GROUP_LIST_FAILURE,
 } from '../actions/group';

В верхней части этого файла импортирован API, который импортировал хранилище, затем импортировал редукторы, затем объединил все редукторы, которые, конечно, включали мой групповой редуктор, который я уже включил.

Итак, я не уверен в точной причине, но мой тест определенно включал в себя намного больше кода, чем должно быть, что, вероятно, указывает на архитектурный сбой где-то в приложении.

Мое решение на данный момент состоит в том, чтобы следовать более подходу утки , когда действия включены вместе с создателями действий и редукторами в одном файле.

Другим подходом может быть выделение констант действия в их собственный файл.

...