これは パート 5: Redux Toolkit と RTK クエリのテスト戦略 のドラフトです。このパートでは、単体テスト、統合テスト、コードの堅牢性と保守性の確保に重点を置き、Redux Toolkit と RTK クエリをテストするためのベスト プラクティスについて説明します。
テストは、アプリケーション開発プロセスの重要な側面です。これにより、アプリケーションが期待どおりに動作することが保証され、バグを早期に発見し、変更を加える際に自信が得られます。 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 の状態管理の中核です。これらのスライスの単体テストにより、リデューサーとアクションが正しく動作することが確認されます。
次のpostSlice.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;
投稿の単体テストSlice 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 リクエストをモックし、スライスがそれらのリクエストをどのように処理するかを検証する必要があります。
MSW を構成するための setupTests.js ファイルを作成します:
// 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(); }); });
説明:
このパートでは、リデューサーとスライスの単体テスト、MSW を使用した RTK クエリ API スライスのテスト、Redux ストアと対話するコンポーネントの統合テストの作成など、Redux Toolkit と RTK クエリのさまざまなテスト戦略について説明しました。これらのベスト プラクティスに従うことで、Redux アプリケーションの堅牢性、信頼性、保守性を確保できます。
これで、Redux Toolkit と RTK クエリに関するシリーズは終了です。これらのパートが、効果的なテスト戦略を含む、基本から高度なトピックまで Redux Toolkit を理解するのに役立つことを願っています。
コーディングを楽しんでください。アプリが常に最高の状態にあることを確認するためにテストを続けてください!
以上が完全な redux ツールキット (パート -5)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。