所以我正在为服务器端redux存储编写单元测试,该存储从API获取一些数据,然后使用相同的数据更新状态 .
我正在使用redux-mock-store来编写单元测试,正如Redux文档所建议的那样 .
下面是我初始化mock redux存储并描述单元测试的地方
it('handles making API requests for the populated lists', () => {
const middlewares = [thunk];
const mockStore = configureStore(middlewares);
const store = mockStore({});
const state = fromJS({
tickers: ['AAPL', 'TSLA', 'GOOGL'],
data: {
AAPL: Map(),
TSLA: Map(),
GOOGL: Map()
}
});
const tickerArray = ['AAPL', 'TSLA', 'GOOGL'];
return store.dispatch(fetchData(state, tickerArray)).then((data) => {
store.dispatch(addDataToState(state, data));
});
});
以下是函数fetchData和addDataToState,这两个函数都列为操作 .
export function fetchData(state, tickerArray) {
return dispatch => {
return yahooFinance.historical({
symbols: tickerArray,
from: '2012-01-01',
to: '2012-01-05',
period: 'd'
}, (err, quotes) => {
throw new Error('err');
}).then(result => {
return result;
})
}
}
export function addDataToState(state, data) {
return {
type: 'ADD_DATA_TO_STATE',
state,
data
}
}
这是在调用addDataToState函数并返回操作后控制流应该移动到的reducer .
从'./core.js'导入{setTickers,addTicker,removeTicker,addTickerKeys,addDataToState};
import {Map} from 'immutable';
export default function (state = Map(), action) {
switch(action.type) {
case 'SET_TICKERS':
return setTickers(state, action.tickers);
case 'ADD_TICKER':
return addTicker(state, action.ticker);
case 'REMOVE_TICKER':
return removeTicker(state, action.ticker);
case 'ADD_KEY_VALUE_PAIRS':
return addTickerKeys(state);
case 'ADD_DATA_TO_STATE':
return addDataToState(state, action.data);
default:
return state;
}
}
最后,核心逻辑将数据添加到相应的密钥
export function addDataToState(state, data){
console.log('In addDataToState');
let new_state = state;
for(let key in data){
new_state = state.setIn(['data', key], data[key]);
state = state.merge(new_state);
}
//dispatch(success());
}
所以,我需要的是一种方法,一旦我调度fetchData函数,控制流到addDataToState动作创建者,并从那里到reducer,它将实现正确的情况,最后调用正确的核心逻辑函数,在这种情况是最后列出的addDataToState(抱歉类似的命名) .
从那里开始,我想派遣一个动作来测试单元测试工作 .
注意:我使用redux-thunk来测试我的异步操作 .