Redux测试 – Redux教程

上一章Redux教程请查看:Redux Devtool开发工具

测试Redux代码很简单,因为我们主要编写函数,而且大多数函数都是纯函数,所以我们可以在不模拟他们的情况下测试它。在这里,我们使用JEST作为测试引擎,它在节点环境中工作,不访问DOM。

我们可以用下面的代码安装JEST

npm install --save-dev jest

使用babel,你需要按如下方式安装babel-jest

npm install --save-dev babel-jest

并将其配置为在.babelrc文件中使用babel-preset-env特性,如下所示

{ 
    "presets": ["@babel/preset-env"] 
 }
 And add the following script in your package.json:
 { 
    //Some other code 
    "scripts": {
       //code
       "test": "jest", 
       "test:watch": "npm test -- --watch" 
    }, 
    //code 
 }

最后,运行npm
test或npm run test,让我们检查一下如何为action创建者和reducer编写测试用例。

动作创建器的测试用例

让我们假设你有如下所示的动作创建器

export function itemsRequestSuccess(bool) {
    return {
       type: ITEMS_REQUEST_SUCCESS,
       isLoading: bool,
    }
 }

这个action
creator可以像下面这样测试

import * as action from '../actions/actions';
import * as types from '../../constants/ActionTypes';

describe('actions', () => {
   it('是否应该创建一个动作来检查项目是否正在加载', () => { 
      const isLoading = true, 
      const expectedAction = { 
         type: types.ITEMS_REQUEST_SUCCESS, isLoading 
      } 
      expect(actions.itemsRequestSuccess(isLoading)).toEqual(expectedAction) 
   })
})

reducer的测试用例

我们已经了解到,当action被应用时,reducer应该返回一个新的状态。因此,对这种动作的reducer进行了测试。

考虑如下所示的reducer:

const initialState = {
    isLoading: false
 };
 const reducer = (state = initialState, action) => {
    switch (action.type) {
       case 'ITEMS_REQUEST':
          return Object.assign({}, state, {
             isLoading: action.payload.isLoading
          })
       default:
          return state;
    }
 }
 export default reducer;

为了测试上面的reducer,我们需要将状态和动作传递给reducer,并返回一个新的状态,如下图所示

import reducer from '../../reducer/reducer' 
import * as types from '../../constants/ActionTypes'

describe('reducer初始状态', () => {
   it('应该返回初始状态', () => {
      expect(reducer(undefined, {})).toEqual([
         {
            isLoading: false,
         }
      ])
   })
   it('应该处理ITEMS_REQUEST', () => {
      expect(
         reducer(
            {
               isLoading: false,
            },
            {
               type: types.ITEMS_REQUEST,
               payload: { isLoading: true }
            }
         )
      ).toEqual({
         isLoading: true
      })
   })
})

如果你不熟悉编写测试用例,你可以查看JEST更多的基础知识。

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?