りゅうじの学習blog

学習したことをアウトプットしていきます。

6/26 mswと Redux Toolkitを組み合わせて使う

MSW (Mock Service Worker)

MSW はブラウザのネットワークリクエストをインターセプトし、モックのレスポンスを返すことができるツールです。これにより、実際のサーバーと通信することなく、API のレスポンスをシミュレートすることができます。

  • コンポーネントが Redux の非同期アクションをディスパッチします(例:ユーザー情報を取得する fetchUser アクション)。
  • fetchUser アクションは API リクエストを行います。
  • MSW がこの API リクエストをインターセプトし、モックのレスポンスを返します。
  • fetchUser アクションはこのレスポンスを受け取り、Redux の状態を更新します。

これにより、実際のサーバーと通信することなく、API リクエストの結果に基づいた Redux の状態の変化をシミュレートすることができます。

// mocks/handlers.js

import { rest } from 'msw';

export const handlers = [
  rest.get('/api/user', (req, res, ctx) => {
    return res(
      ctx.json({
        id: 1,
        name: 'John Doe',
      })
    );
  }),
];

mswの設定です

// features/user/userSlice.js

import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';

export const fetchUser = createAsyncThunk('user/fetchUser', async () => {
  const response = await fetch('/api/user');
  const data = await response.json();
  return data;
});

const userSlice = createSlice({
  name: 'user',
  initialState: { id: null, name: '' },
  reducers: {},
  extraReducers: (builder) => {
    builder.addCase(fetchUser.fulfilled, (state, action) => {
      state.id = action.payload.id;
      state.name = action.payload.name;
    });
  },
});

export const userReducer = userSlice.reducer;

createAsyncThunkで非同期アクションをします

// components/User.js

import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { fetchUser } from '../features/user/userSlice';

export const User = () => {
  const dispatch = useDispatch();
  const user = useSelector((state) => state.user);

  useEffect(() => {
    dispatch(fetchUser());
  }, [dispatch]);

  return (
    <div>
      <h1>User</h1>
      <p>ID: {user.id}</p>
      <p>Name: {user.name}</p>
    </div>
  );
};

コンポーネントでdispatchします

// .storybook/preview.js

import { setupWorker } from 'msw';
import { handlers } from '../mocks/handlers';

const worker = setupWorker(...handlers);
worker.start();

// 他のStorybookの設定...

storybookの設定でmswを使用します

コメント

流れが分かってなかったので、まとめました。複雑になるとよくわからなくなる箇所がまだあるので、理解が浅いところを埋めていこうと思います。