我有这样的东西。假设以下文件是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/