Redux - การทดสอบ

การทดสอบโค้ด Redux เป็นเรื่องง่ายเนื่องจากเราเขียนฟังก์ชันเป็นส่วนใหญ่และส่วนใหญ่เป็นฟังก์ชันที่บริสุทธิ์ ดังนั้นเราสามารถทดสอบได้โดยไม่ต้องเยาะเย้ยพวกเขา ที่นี่เราใช้ JEST เป็นเครื่องมือทดสอบ ทำงานในสภาพแวดล้อมโหนดและไม่เข้าถึง DOM

เราสามารถติดตั้ง JEST ด้วยรหัสที่ระบุด้านล่าง -

npm install --save-dev jest

ด้วย Babel คุณต้องติดตั้ง babel-jest ดังต่อไปนี้ -

npm install --save-dev babel-jest

และกำหนดค่าให้ใช้คุณสมบัติ babel-preset-env ในไฟล์. babelrc ดังนี้ -

{ 
   "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 
}

สุดท้าย run npm test or npm run test. ให้เราตรวจสอบว่าเราจะเขียนกรณีทดสอบสำหรับผู้สร้างการดำเนินการและตัวลดได้อย่างไร

กรณีทดสอบสำหรับ Action Creators

สมมติว่าคุณมีผู้สร้างการกระทำดังที่แสดงด้านล่าง -

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

ผู้สร้างการกระทำนี้สามารถทดสอบได้ตามที่ระบุด้านล่าง -

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

describe('actions', () => {
   it('should create an action to check if item is loading', () => { 
      const isLoading = true, 
      const expectedAction = { 
         type: types.ITEMS_REQUEST_SUCCESS, isLoading 
      } 
      expect(actions.itemsRequestSuccess(isLoading)).toEqual(expectedAction) 
   })
})

กรณีทดสอบสำหรับตัวลด

เราได้เรียนรู้ว่าตัวลดควรคืนสถานะใหม่เมื่อใช้การดำเนินการ ดังนั้นตัวลดจึงถูกทดสอบกับพฤติกรรมนี้

พิจารณาตัวลดตามที่ระบุด้านล่าง -

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;

ในการทดสอบตัวลดด้านบนเราจำเป็นต้องส่งผ่านสถานะและการดำเนินการไปยังตัวลดและส่งคืนสถานะใหม่ดังที่แสดงด้านล่าง -

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

describe('reducer initial state', () => {
   it('should return the initial state', () => {
      expect(reducer(undefined, {})).toEqual([
         {
            isLoading: false,
         }
      ])
   })
   it('should handle ITEMS_REQUEST', () => {
      expect(
         reducer(
            {
               isLoading: false,
            },
            {
               type: types.ITEMS_REQUEST,
               payload: { isLoading: true }
            }
         )
      ).toEqual({
         isLoading: true
      })
   })
})

ถ้าคุณไม่คุ้นเคยกับการเขียนกรณีทดสอบคุณสามารถตรวจสอบพื้นฐานของความตลกขบขัน