Closed10
Storybookの上でMSWが動くようにしたいんじゃ
そもそもMSWについて調べる必要がありそう
サーバーのレスポンスをモックしてくれるもの。JSのService Workerを利用してモックしているので、呼び出し側でモック用のAPIを叩く必要はなく、通常通りのエンドポイントをモックすることができる?(ここら辺曖昧)
最終的な目標は、GitHub PagesにデプロイしてあるStoryook上でmswのモック通信を行えること。
現状TestButtonみたいなコンポーネントしかないから、そのボタン押した時にモックのレスポンスが返ってきてるのをコンソールで確認できたら目標達成かな
Storybookをmswの記事を見てみる
これに従ってやってこかな
依存関係追加
pnpm install msw msw-storybook-addon -D
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にクローズされました