Jest测试Redux Toolkit组件时报Store does not have a valid reducer错误
Redux测试拆分Reducer后提示无有效Reducer问题排查
我已经排查这个问题很久了,但始终没找到错误根源。
我当前正在测试一个依赖Redux store获取用户相关状态的组件。
为了适配项目后续扩容的架构需求,我将独立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() })
这种实现显然不合理,我需要测试实际业务的reducer,因此我做了如下调整来排查失败原因:
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() })
我编写的Reducer代码如下:
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;
调整后测试依然可以通过,但控制台抛出了大量错误,后续测试会因为reducer为undefined而失败。
控制台报错信息如下:
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无法解决该问题。
内容的提问来源于stack exchange,提问作者Jeppe Christensen
相关产品推荐
相关产品推荐

