如何覆盖redux reducers中的默认状态参数?

时间:2018-06-06 18:32:08

标签: javascript reactjs unit-testing redux jestjs

我有类似的东西。假设以下文件是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数组的值。那怎么做呢。请帮我。

提前致谢。

1 个答案:

答案 0 :(得分:2)

首先,你的减速机写错了。第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部分。