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
})
})
})
ถ้าคุณไม่คุ้นเคยกับการเขียนกรณีทดสอบคุณสามารถตรวจสอบพื้นฐานของความตลกขบขัน