所以我正在为服务器端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来测试我的异步操作 .