Closed10

Storybookの上でMSWが動くようにしたいんじゃ

ゆーけんゆーけん

そもそもMSWについて調べる必要がありそう

https://zenn.dev/takepepe/articles/msw-driven-development

サーバーのレスポンスをモックしてくれるもの。JSのService Workerを利用してモックしているので、呼び出し側でモック用のAPIを叩く必要はなく、通常通りのエンドポイントをモックすることができる?(ここら辺曖昧)

ゆーけんゆーけん

最終的な目標は、GitHub PagesにデプロイしてあるStoryook上でmswのモック通信を行えること。

現状TestButtonみたいなコンポーネントしかないから、そのボタン押した時にモックのレスポンスが返ってきてるのをコンソールで確認できたら目標達成かな

ゆーけんゆーけん

Service Workerをpublicディレクトリに作成するらしい

npx msw init public/

mockServiceWorker.jsが出来上がった

ゆーけんゆーけん
import { initialize, mswLoader } from 'msw-storybook-addon'

// Initialize MSW
initialize()

const preview = {
  parameters: {
    // your other code...
  },
  // Provide the MSW addon loader globally
  loaders: [mswLoader],
}

export default preview

こんな感じでPreview.tsxを編集

ゆーけんゆーけん

mockServiceWorker.jsをStorybookから読み込むために、

staticDirs: ["../public"],

staticDirを指定してあげる必要があるらしい

ゆーけんゆーけん

コンポーネントのstoryにmswの設定を追加してみる

test-button.stories.ts
import type { Meta, StoryObj } from "@storybook/react";
import { expect, userEvent, within } from "@storybook/test";
import { http, HttpResponse } from "msw";
import { TestButton } from "./test-button";

const meta: Meta<typeof TestButton> = {
  component: TestButton,
};

export default meta;
type Story = StoryObj<typeof TestButton>;

export const Default: Story = {
  args: {
    title: "hoge",
    onClick: () => {
      fetch("/user");
    },
  },
  parameters: {
    msw: {
      handlers: [
        http.get("/user", () => {
          return HttpResponse.json({
            firstName: "Neil",
            lastName: "Maverick",
          });
        }),
      ],
    },
  },
  play: async ({ args, canvasElement }) => {
    const canvas = within(canvasElement);

    await userEvent.click(canvas.getByRole("button"));

    await expect(args.onClick).toHaveBeenCalled();
  },
};

このスクラップは2024/05/10にクローズされました