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