我有这样的东西。假设以下文件是reducers123.js

import {combineReducers} from 'redux';
import * as types from './actionTypes';

function reducer1(state = {
    someId: 0,
    someCategory: []
}, action) {
  switch(action.type) {
     'someActionType1' :
          state.someCategory = action.someCategoryData;
          break;
     'someActionType2' :
          state.id = action.someId;
          break;
  }
}


const appReducer = combineReducers({reducer1});
export default appReducer;


我在测试文件中按以下方式调用上述reducer。

import reducers from `./reducers123.js`;

describe('some reducer test case', () => {
    it('test case', () => {
       reducers({someCategory: ['d1', 'd2', 'd3']}, {type: 'someActionType1'});
    });
});


因此,这里应将someCategory数据作为['d1', 'd2', 'd3'],但它将使用我最初定义的空数组[]。我需要在测试用例中覆盖someCategory数组的值。那么怎么做。请帮我。

提前致谢。

最佳答案

首先,你的减速器写错了。 state.someCategory = action.someCategoryData;行正在更改现有的state参数-请勿这样做!相反,您应该制作state对象的副本并覆盖副本中的someCategoryData字段。有关示例,请参见Redux文档中的Immutable Update Patterns页。

其次,当您使用combineReducers时,是说您希望此分片减少器能够处理状态的一个特定键/分片。运行combineReducers({reducer1})时,您要定义一个状态形状,该状态形状是内部带有reducer1键的对象。因此,您的测试需要传递这样的对象:

const testState = {
    reducer1 : {
        someId : 123,
        someCategory : ["d1", "d2", "d3"]
    }
}

const result = reducers(testState, {type : "someActionType1"});
// assert that the result is what you expect


我建议将您的reducer函数分别导出为命名导出,以便您可以对其进行单独测试,并将合并的reducer导出为默认导出。我还建议您通读Redux文档中的Using combineReducers部分。

关于javascript - 如何覆盖Redux Reducer中的默认状态参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50727263/

10-11 05:36