這是第 5 部分:Redux 工具包和 RTK 查詢的測試策略的草稿。這部分將涵蓋測試 Redux Toolkit 和 RTK Query 的最佳實踐,重點是單元測試、整合測試,並確保您的程式碼健壯且可維護。
測試是任何應用程式開發過程的重要方面。它確保您的應用程式按預期運行,幫助及早發現錯誤,並在進行更改時提供信心。借助 Redux Toolkit (RTK) 和 RTK Query,由於其簡化的 API 和減少的樣板文件,測試變得更加容易管理。在這一部分中,我們將探索不同的測試策略,以確保 Redux 應用程式可靠且可維護。
在深入研究特定的測試策略之前,請確保您已設定適當的測試環境。對於典型的 React Redux Toolkit 項目,您可能會使用以下工具:
要安裝這些函式庫,請執行:
npm install --save-dev jest @testing-library/react @testing-library/jest-dom msw
Redux 切片是 Redux Toolkit 中狀態管理的核心。對這些切片進行單元測試可確保減速器和操作正常運作。
考慮以下 postsSlice.js:
// src/features/posts/postsSlice.js import { createSlice } from '@reduxjs/toolkit'; const initialState = { posts: [], status: 'idle', error: null, }; const postsSlice = createSlice({ name: 'posts', initialState, reducers: { addPost: (state, action) => { state.posts.push(action.payload); }, removePost: (state, action) => { state.posts = state.posts.filter(post => post.id !== action.payload); }, }, }); export const { addPost, removePost } = postsSlice.actions; export default postsSlice.reducer;
postsSlice Reducer 的單元檢定:
// src/features/posts/postsSlice.test.js import postsReducer, { addPost, removePost } from './postsSlice'; describe('postsSlice reducer', () => { const initialState = { posts: [], status: 'idle', error: null }; it('should handle initial state', () => { expect(postsReducer(undefined, {})).toEqual(initialState); }); it('should handle addPost', () => { const newPost = { id: 1, title: 'New Post' }; const expectedState = { ...initialState, posts: [newPost] }; expect(postsReducer(initialState, addPost(newPost))).toEqual(expectedState); }); it('should handle removePost', () => { const initialStateWithPosts = { ...initialState, posts: [{ id: 1, title: 'New Post' }] }; const expectedState = { ...initialState, posts: [] }; expect(postsReducer(initialStateWithPosts, removePost(1))).toEqual(expectedState); }); });
說明:
RTK 查詢簡化了 API 集成,但測試這些 API 切片與測試常規切片略有不同。您需要模擬 API 請求並驗證切片如何處理這些請求。
建立 setupTests.js 檔案來設定 MSW:
// src/setupTests.js import { setupServer } from 'msw/node'; import { rest } from 'msw'; const server = setupServer( // Mocking GET /posts endpoint rest.get('https://jsonplaceholder.typicode.com/posts', (req, res, ctx) => { return res(ctx.json([{ id: 1, title: 'Mock Post' }])); }), // Mocking POST /posts endpoint rest.post('https://jsonplaceholder.typicode.com/posts', (req, res, ctx) => { return res(ctx.json({ id: 2, ...req.body })); }) ); // Establish API mocking before all tests beforeAll(() => server.listen()); // Reset any request handlers that are declared as a part of our tests (i.e. for testing one-time errors) afterEach(() => server.resetHandlers()); // Clean up after the tests are finished afterAll(() => server.close());
從 postsApi.js 測試 fetchPosts 查詢:
// src/features/posts/postsApi.test.js import { renderHook } from '@testing-library/react-hooks'; import { Provider } from 'react-redux'; import { setupApiStore } from '../../testUtils'; import { postsApi, useFetchPostsQuery } from './postsApi'; import store from '../../app/store'; describe('RTK Query: postsApi', () => { it('fetches posts successfully', async () => { const { result, waitForNextUpdate } = renderHook(() => useFetchPostsQuery(), { wrapper: ({ children }) => <Provider store={store}>{children}</Provider>, }); await waitForNextUpdate(); expect(result.current.data).toEqual([{ id: 1, title: 'Mock Post' }]); expect(result.current.isLoading).toBeFalsy(); }); });
說明:
整合測試著重於測試不同部分如何協同工作。在 Redux 應用程式中,這通常意味著測試與 Redux 儲存互動的元件。
PostsList元件的整合測試:
// src/features/posts/PostsList.test.js import React from 'react'; import { render, screen, waitFor } from '@testing-library/react'; import { Provider } from 'react-redux'; import store from '../../app/store'; import PostsList from './PostsList'; test('renders posts fetched from the API', async () => { render( <Provider store={store}> <PostsList /> </Provider> ); expect(screen.getByText(/Loading.../i)).toBeInTheDocument(); // Wait for posts to be fetched and rendered await waitFor(() => { expect(screen.getByText(/Mock Post/i)).toBeInTheDocument(); }); });
說明:
在這一部分中,我們介紹了 Redux Toolkit 和 RTK Query 的各種測試策略,包括單元測試減速器和切片、使用 MSW 測試 RTK Query API 切片以及為與 Redux 存儲交互的組件編寫集成測試。透過遵循這些最佳實踐,您可以確保您的 Redux 應用程式健壯、可靠且可維護。
我們的 Redux Toolkit 和 RTK 查詢系列到此結束!我希望這些部分能幫助您從基礎到進階主題理解 Redux Toolkit,包括有效的測試策略。
快樂編碼,並不斷測試以確保您的應用程式始終處於最佳狀態!
以上是完整的 redux 工具包(第-5部分)的詳細內容。更多資訊請關注PHP中文網其他相關文章!