ホームページ > ウェブフロントエンド > jsチュートリアル > 完全な redux ツールキット (パート -5)

完全な redux ツールキット (パート -5)

DDD
リリース: 2024-09-12 20:16:05
オリジナル
1155 人が閲覧しました

Complete redux toolkit (Part -5)

これは パート 5: Redux Toolkit と RTK クエリのテスト戦略 のドラフトです。このパートでは、単体テスト、統合テスト、コードの堅牢性と保守性の確保に重点を置き、Redux Toolkit と RTK クエリをテストするためのベスト プラクティスについて説明します。


パート 5: Redux Toolkit と RTK クエリのテスト戦略

1. Redux アプリケーションにおけるテストの重要性

テストは、アプリケーション開発プロセスの重要な側面です。これにより、アプリケーションが期待どおりに動作することが保証され、バグを早期に発見し、変更を加える際に自信が得られます。 Redux Toolkit (RTK) と RTK Query を使用すると、API が簡素化され定型文が削減されるため、テストがより管理しやすくなります。このパートでは、Redux アプリケーションの信頼性と保守性を確保するためのさまざまなテスト戦略を検討します。

2. テスト環境のセットアップ

特定のテスト戦略に入る前に、適切なテスト環境がセットアップされていることを確認してください。典型的な React Redux Toolkit プロジェクトの場合、次のようなツールを使用します。

  • Jest: JavaScript の人気のあるテスト フレームワーク。
  • React Testing Library (RTL): React コンポーネントをテストするための軽量ソリューション。
  • MSW (Mock Service Worker): テスト中に API リクエストをモックするためのライブラリ。

これらのライブラリをインストールするには、次を実行します:

npm install --save-dev jest @testing-library/react @testing-library/jest-dom msw
ログイン後にコピー

3. Redux スライスの単体テスト

Redux スライスは、Redux Toolkit の状態管理の中核です。これらのスライスの単体テストにより、リデューサーとアクションが正しく動作することが確認されます。

ステップ 1: リデューサーのテスト

次の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);
  });
});
ログイン後にコピー

説明:

  • 初期状態テスト: レデューサーが正しい初期状態を返すことを検証します。
  • アクション テスト: addPost アクションとremovePost アクションをテストして、状態が正しく変更されることを確認します。

4. RTK クエリ API スライスのテスト

RTK クエリは API 統合を簡素化しますが、これらの API スライスのテストは通常​​のスライスのテストとは少し異なります。 API リクエストをモックし、スライスがそれらのリクエストをどのように処理するかを検証する必要があります。

ステップ 1: API リクエストをモックするための MSW のセットアップ

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());
ログイン後にコピー

ステップ 2: RTK クエリ エンドポイントのテストを作成する

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();
  });
});
ログイン後にコピー

説明:

  • MSW セットアップ: setupServer は、API エンドポイントを模擬するように MSW を構成します。
  • レンダー フック: React Testing Library の renderHook ユーティリティは、useFetchPostsQuery などのカスタム フックをテストするために使用されます。
  • モックされた API レスポンス: モックされた API レスポンスを使用してフックの動作を検証します。

5. Redux とコンポーネントの統合テスト

統合テストは、さまざまな部分がどのように連携して動作するかをテストすることに重点を置いています。 Redux アプリケーションでは、これは多くの場合、Redux ストアと対話するコンポーネントをテストすることを意味します。

ステップ 1: React テスト ライブラリを使用して統合テストを作成する

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();
  });
});
ログイン後にコピー

説明:

  • 読み込み状態テスト: 読み込みインジケーターが最初に表示されることを確認します。
  • データ レンダリング テスト: 投稿がフェッチされるのを待ち、投稿が正しくレンダリングされることを確認します。

6. Redux Toolkit と RTK クエリをテストするためのベスト プラクティス

  • API モッキングに MSW を使用する: MSW は、ネットワーク リクエストをモックし、ネットワーク エラーや応答の遅さなどのさまざまなシナリオをシミュレートするための強力なツールです。
  • Reducer を分離してテストする: Reducer テストは純粋な関数であるため、アクションが正しく処理されることを確認するために個別にテストする必要があります。
  • フックを分離してテストする: React テスト ライブラリの renderHook を使用して、UI コンポーネントから独立してフックをテストします。
  • API スライス テストに setupApiStore を使用する: RTK クエリ エンドポイントをテストする場合、setupApiStore を使用して API スライスで Redux ストアをモックします。
  • コンポーネントの統合テストに重点を置く: 統合テスト用にスライス テストとコンポーネント テストを組み合わせて、正しく連携していることを確認します。
  • エッジ ケースのカバレッジを確保: API エラー、空の状態、無効なデータなどのエッジ ケースをテストして、堅牢性を確保します。

7. 結論

このパートでは、リデューサーとスライスの単体テスト、MSW を使用した RTK クエリ API スライスのテスト、Redux ストアと対話するコンポーネントの統合テストの作成など、Redux Toolkit と RTK クエリのさまざまなテスト戦略について説明しました。これらのベスト プラクティスに従うことで、Redux アプリケーションの堅牢性、信頼性、保守性を確保できます。

これで、Redux Toolkit と RTK クエリに関するシリーズは終了です。これらのパートが、効果的なテスト戦略を含む、基本から高度なトピックまで Redux Toolkit を理解するのに役立つことを願っています。

コーディングを楽しんでください。アプリが常に最高の状態にあることを確認するためにテストを続けてください!

以上が完全な redux ツールキット (パート -5)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート