Компонент тестирования с помощью Jest, использующий Redux-инструментарий, «В магазине нет допустимого редуктора»

#reactjs #redux #jestjs

Вопрос:

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

В настоящее время я нахожусь в процессе тестирования компонента, который использует Redux-хранилище для получения определенных состояний для пользователя.

Как есть, я сохраняю отдельные reducers combineReducer и Store отдельные файлы для лучшей структуры по мере роста проекта.

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

 test('Component renders', () => {
    const test = shallow(<Provider store={mockStore}>
        <UserPage />
    </Provider>)
    expect(test).not.toBeNull()
})
 

В настоящее время я пытаюсь вернуться назад в процессе выяснения того, почему мой тест проходит с кучей ошибок:

Для меня работает следующее (я помещаю все в свой тестовый файл):

 import { userObject } from "../../constants";
import { combineReducers, configureStore, createSlice } from '@reduxjs/toolkit';
import { Provider } from 'react-redux';
import UserPage from './UserPage';

const initialState = {
    user: userObject,
    loadingUser: false,
};
const userSlice = createSlice({
    name: 'user',
    initialState: initialState,
    reducers: {
        setUser(state, action) {
            state.user = action.payload
        },
        setLoadingUser(state) {
            state.loadingUser = !state.loadingUser
        }
    }
})

const reducers = combineReducers({
    user: userReducer
});



const mockStore = configureStore({ reducer: reducers })

test('Component renders', () => {
    const test = shallow(<Provider store={mockStore}>
        <UserPage />
    </Provider>)
    expect(test).not.toBeNull()
})
 

Естественно, это не оптимально, потому что я хочу проверить свой настоящий редуктор — Поэтому я пошел дальше и сделал следующее (в качестве следующего шага в обратном направлении — понимание того, почему он не работает).:

 import userReducer from '../PATH/userReducer'
import { userObject } from "../../constants";


const reducers = combineReducers({
    user: userReducer
});
const mockStore = configureStore({ reducer: reducers })

test('Component renders', () => {
    const test = shallow(<Provider store={mockStore}>
        <UserPage />
    </Provider>)
    expect(test).not.toBeNull()
})
 

Мой Редуктор:

 import { createSlice } from "@reduxjs/toolkit";

const initialState = {
    user: userObject,
    loadingUser: false,
};


const userSlice = createSlice({
    name: 'user',
    initialState: initialState,
    reducers: {
        setUser(state, action) {
            state.user = action.payload
        },
        setLoadingUser(state) {
            state.loadingUser = !state.loadingUser
        }
    }
})

export default userSlice.reducer;
 

Теперь мой тест проходит, но по какой — то причине-он выдает мне кучу ошибок (что в конечном итоге приведет к провалу моих дальнейших тестов, потому что редуктор «не определен»).

ошибки консоли:

 console.error
Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers.

  at warning (node_modules/redux/lib/redux.js:402:13)
  at currentReducer (node_modules/redux/lib/redux.js:525:9)
  at dispatch (node_modules/redux/lib/redux.js:296:22)
  at apply (node_modules/redux/lib/redux.js:382:3)
  at node_modules/redux/lib/redux.js:658:31
  at createStore (node_modules/redux/lib/redux.js:162:12)
  at configureStore (node_modules/@reduxjs/toolkit/dist/redux-toolkit.cjs.development.js:536:12)
 

ПРИМЕЧАНИЕ. Жесткое кодирование userObject не оказывает эффекта.

Ответ №1:

Я бы предположил, что ваш импорт userReducer — это неправильный путь или что-то подобное-попробуйте console.log его перед использованием combineReducers , чтобы убедиться, что он определен и функция.

Кроме того, в качестве общей обратной связи: неглубокий рендеринг с помощью фермента, вероятно, не будет работать очень хорошо в будущем (это уже довольно проблематично). Возможно, вы захотите заглянуть в библиотеку тестирования, чтобы быть уверенными в будущем.

Комментарии:

1. Путь правильный (также я не получаю никаких ошибок импорта) — Просто для удовольствия я скопировал userReducer в тот же каталог, что и мой тест, — И теперь он работает без ошибок… Может ли быть так, что длина моего пути приводит к его провалу?

2. Это было бы очень необычно, но, вероятно, не невозможно…? Честно говоря, не знаю. Но, по крайней мере, теперь у вас есть указатель 🙂