Hier ist der Entwurf für Teil 5: Teststrategien für Redux Toolkit und RTK-Abfrage. In diesem Teil werden die Best Practices zum Testen von Redux Toolkit und RTK Query behandelt, wobei der Schwerpunkt auf Unit-Tests, Integrationstests und der Sicherstellung liegt, dass Ihr Code robust und wartbar ist.
Testen ist ein entscheidender Aspekt jedes Anwendungsentwicklungsprozesses. Es stellt sicher, dass sich Ihre Anwendung wie erwartet verhält, hilft dabei, Fehler frühzeitig zu erkennen und sorgt für Sicherheit bei der Durchführung von Änderungen. Mit Redux Toolkit (RTK) und RTK Query werden Tests aufgrund der vereinfachten APIs und der reduzierten Boilerplate einfacher zu verwalten. In diesem Teil werden wir verschiedene Teststrategien untersuchen, um sicherzustellen, dass Redux-Anwendungen zuverlässig und wartbar sind.
Bevor Sie sich mit spezifischen Teststrategien befassen, stellen Sie sicher, dass Sie eine geeignete Testumgebung eingerichtet haben. Für ein typisches React Redux Toolkit-Projekt können Sie Tools verwenden wie:
Um diese Bibliotheken zu installieren, führen Sie Folgendes aus:
npm install --save-dev jest @testing-library/react @testing-library/jest-dom msw
Redux-Slices sind der Kern der Zustandsverwaltung im Redux Toolkit. Durch Unit-Tests dieser Slices wird sichergestellt, dass Reduzierer und Aktionen ordnungsgemäß funktionieren.
Betrachten Sie die folgenden BeiträgeSlice.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;
Unit-Tests für BeiträgeSlice-Reduzierer:
// 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); }); });
Erklärung:
RTK Query vereinfacht die API-Integration, aber das Testen dieser API-Slices unterscheidet sich geringfügig vom Testen normaler Slices. Sie müssen API-Anfragen simulieren und überprüfen, wie das Slice diese Anfragen verarbeitet.
Erstellen Sie eine setupTests.js-Datei, um MSW zu konfigurieren:
// 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());
Testen der fetchPosts-Abfrage von postsApi.js:
// 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(); }); });
Erklärung:
Integrationstests konzentrieren sich darauf, zu testen, wie verschiedene Teile zusammenarbeiten. In Redux-Anwendungen bedeutet dies häufig das Testen von Komponenten, die mit dem Redux-Store interagieren.
Integrationstest für die PostsList-Komponente:
// 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(); }); });
Erklärung:
In diesem Teil haben wir verschiedene Teststrategien für Redux Toolkit und RTK Query behandelt, darunter Unit-Tests von Reduzierern und Slices, das Testen von RTK Query API-Slices mit MSW und das Schreiben von Integrationstests für Komponenten, die mit dem Redux-Store interagieren. Durch Befolgen dieser Best Practices können Sie sicherstellen, dass Ihre Redux-Anwendungen robust, zuverlässig und wartbar sind.
Damit ist unsere Serie über Redux Toolkit und RTK Query abgeschlossen! Ich hoffe, diese Teile haben Ihnen geholfen, Redux Toolkit von den Grundlagen bis hin zu fortgeschrittenen Themen, einschließlich effektiver Teststrategien, zu verstehen.
Viel Spaß beim Codieren und testen Sie weiter, um sicherzustellen, dass Ihre Apps immer in Topform sind!
Das obige ist der detaillierte Inhalt vonKomplettes Redux-Toolkit (Teil -5). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!