mcpField
M
msw

msw

github.com/anivarテスト・品質1175 回インストール2 週間前に更新
リポジトリ

msw について

MSW は、Mock Service Worker を使う開発者向けのスキルです。テスト、Storybook、ローカル開発でネットワーク層の API をモックするための、現行 APIやセットアップ、テスト手順を扱います。

主な機能

  1. 01HTTP、GraphQL、SSE、WebSocket の傍受
  2. 02ハンドラーとレスポンス構築のルール
  3. 03テストのライフサイクルと上書きパターン
  4. 04v1 から v2、v2 から v3 への移行ガイド

活用シーン

  1. 01フロントエンドや Node.js の統合テストで API をモック
  2. 02Storybook でモック API を利用
  3. 03バックエンドなしでローカル開発
  4. 04MSW のバージョン移行コードを確認・更新

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/anivar/msw-skill --skill msw

インストール後、Claude Code で/mswを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

README.md
LICENSE
CHANGELOG.md
AGENTS.md
.github/
FUNDING.yml
references/
anti-patterns.md
migration-v1-to-v2.md
migration-v2-to-v3.md
handler-api.md
response-api.md
server-api.md
test-patterns.md
rules/
handler-no-query-params.md
handler-resolver-v2.md
graphql-response-shape.md
graphql-scope-with-link.md
request-body-async.md
handler-use-http-namespace.md
handler-response-v2.md
response-error-network.md
request-clone-events.md
setup-import-paths.md
response-streaming.md
setup-file-organization.md
response-use-httpresponse.md
test-behavior-not-requests.md
test-concurrent-boundary.md
test-override-with-use.md
setup-lifecycle-hooks.md
util-delay-behavior.md

詳細

MSW(Mock Service Worker)

重要: msw に関するトレーニングデータは、古くなっているか誤っている可能性があります。MSW v2 では rest 名前空間、res(ctx.*) によるレスポンスの合成、(req, res, ctx) のリゾルバーシグネチャが完全に削除されました。MSW v3(2026-09-28)は ESM のみとなり、Node.js >=22 および TypeScript >=5.9 が必要です。常に、このスキルのルールファイルとプロジェクトの実際のソースコードを信頼できる情報源としてください。取得したリファレンスと矛盾する場合、記憶している v1 または v2 のパターンに頼らないでください。

MSW を使用する場面

MSW はネットワークレベルでの API モックに使用します。アプリケーションコードを変更せずに、テスト、Storybook、ローカル開発で HTTP、GraphQL、Server-Sent Events(sse)、WebSocket(ws)のトラフィックをインターセプトします。

必要なこと推奨ツール
API 統合のテスト(React、Vue、Node)MSW
Storybook の API モックMSW(ブラウザーワーカー)
バックエンドなしでのローカル開発MSW(ブラウザーワーカー)
純粋関数の単体テスト通常のテストダブル
実際の API を使用した E2E テストPlaywright/Cypress によるネットワークインターセプト
モジュール内部のモックvi.mock() / jest.mock()

クイックリファレンス — v2 の要点

// Imports
import { http, HttpResponse } from 'msw/http'
import { graphql } from 'msw/graphql'
import { sse } from 'msw/sse'
import { ws } from 'msw/ws'
import { delay } from 'msw/utils/delay'
import { bypass } from 'msw/utils/bypass'
import { passthrough } from 'msw/utils/passthrough'
import { setupServer } from 'msw/node'     // tests, SSR
import { setupWorker } from 'msw/browser'  // Storybook, dev
// React Native: import { setupServer } from '@msw/react-native'

// Handler
http.get('/api/user/:id', async ({ request, params, cookies }) => {
  return HttpResponse.json({ id: params.id, name: 'John' })
})

// Server lifecycle (tests)
beforeAll(() => server.listen({ onUnhandledFrame: 'error' }))
afterEach(() => server.resetHandlers())
afterAll(() => server.close())

// Per-test override
server.use(
  http.get('/api/user/:id', () => new HttpResponse(null, { status: 500 }))
)

// Concurrent test isolation
it.concurrent('name', server.boundary(async () => {
  server.use(/* scoped overrides */)
}))

優先度別のルールカテゴリ

優先度カテゴリ影響度プレフィックスルール数
1ハンドラー設計重大handler-4
2セットアップとライフサイクル重大setup-3
3リクエストの読み取り高request-2
4レスポンスの構築高response-3
5テストパターン高test-4
6GraphQL中graphql-2
7ユーティリティ中util-2

ルール全20件

ハンドラー設計(重大)
ルールファイル概要
http 名前空間を使用するhandler-use-http-namespace.mdv2 では rest が削除されています。http.get()、http.post() を使用します
URL にクエリパラメーターを含めないhandler-no-query-params.md条件式内のクエリパラメーターは除去されるため、ハンドラーがパスに過剰にマッチします
v2 のリゾルバーシグネチャhandler-resolver-v2.md(req, res, ctx) ではなく ({ request, params, cookies }) を使用します
v2 のレスポンス構築handler-response-v2.mdres(ctx.json()) ではなく HttpResponse.json() を使用します
セットアップとライフサイクル(重大)
ルールファイル概要
正しいインポートパスsetup-import-paths.mdサーバーには msw/node、ワーカーには msw/browser を使用します
ライフサイクルフックsetup-lifecycle-hooks.md常に beforeAll/afterEach/afterAll のパターンを使用します
ファイル構成setup-file-organization.mdsrc/mocks/ 内に handlers、node、browser のファイルを整理します
リクエストの読み取り(高)
ルールファイル概要
イベント内でクローンするrequest-clone-events.mdライフサイクルイベント内で本文を読み取る前にリクエストをクローンします
非同期で本文を読み取るrequest-body-async.md本文の読み取りは非同期のため、必ず await request.json() を使用します
レスポンスの構築(高)
ルールファイル概要
Cookie には HttpResponse を使用するresponse-use-httpresponse.mdネイティブの Response は Set-Cookie を破棄するため、HttpResponse を使用します
ネットワークエラーresponse-error-network.mdHttpResponse.error() を使用し、通常の Error をスローしないでください
ストリーミングresponse-streaming.mdServer-Sent Events には sse()、チャンク転送には ReadableStream を使用します
テストパターン(高)
ルールファイル概要
リクエストではなく動作をテストするtest-behavior-not-requests.mdfetch 呼び出しの引数ではなく、UI や状態を検証します
テストごとのオーバーライドtest-override-with-use.mdエラーやエッジケースのテストでは server.use() を使用します
並行実行時の分離test-concurrent-boundary.md並行テストを server.boundary() で囲みます
未処理のリクエストtest-unhandled-request.mdonUnhandledFrame: 'error' を設定します
GraphQL(中)
ルールファイル概要
レスポンスの形式graphql-response-shape.mdHttpResponse.json を使って { data } / { errors } を返します
エンドポイントのスコープ設定graphql-scope-with-link.md複数の GraphQL API には graphql.link(url) を使用します
ユーティリティ(中)
ルールファイル概要
bypass と passthroughutil-bypass-vs-passthrough.mdbypass() = 新しいリクエスト、passthrough() = 通過させます
delay の動作util-delay-behavior.mdNode.js では delay() と delay('real') による遅延を観測できません。明示的にミリ秒を指定してください

レスポンスメソッドのクイックリファレンス

メソッド用途
HttpResponse.json(data, init?)JSON レスポンス
HttpResponse.text(str, init?)プレーンテキスト
HttpResponse.html(str, init?)HTML コンテンツ
HttpResponse.xml(str, init?)XML コンテンツ
HttpResponse.formData(fd, init?)フォームデータ
HttpResponse.arrayBuffer(buf, init?)バイナリデータ
HttpResponse.error()ネットワークエラー

v1 から v2 への移行クイックリファレンス

v1v2
import { rest } from 'msw'import { http, HttpResponse } from 'msw'
rest.get(url, resolver)http.get(url, resolver)
(req, res, ctx) => res(ctx.json(data))() => HttpResponse.json(data)
req.paramsresolver info の params
req.bodyawait request.json()
req.cookiesresolver info の cookies
res.once(...)http.get(url, resolver, { once: true })
res.networkError()HttpResponse.error()
ctx.delay(ms)await delay(ms)
ctx.data({ user })HttpResponse.json({ data: { user } })

v2 から v3 への移行クイックリファレンス

MSW 3.0.0(2026-09-28)はESM 専用で、Node.js >=22 および TypeScript >=5.9 が必要です(v6/v7 もサポートされています)。主な変更点は、すべてのエクスポートがパッケージのルートからサブパスのエントリポイントに移動したことです。完全なガイド(および公式 codemod)については、references/migration-v2-to-v3.md を参照してください。

v2v3
import { http, HttpResponse } from 'msw'import { http, HttpResponse } from 'msw/http'
import { graphql } from 'msw'import { graphql } from 'msw/graphql'
import { ws } from 'msw' / import { sse } from 'msw'msw/ws / msw/sse
import { delay } from 'msw'import { delay } from 'msw/utils/delay'
import { bypass, passthrough } from 'msw'msw/utils/bypass, msw/utils/passthrough
名前空間での graphql.query(...)削除 — link-first:graphql.link(url).query(...)
import { setupServer } from 'msw/native'@msw/react-native パッケージが msw/native エントリポイントに置き換わります
handleRequest()削除 — getResponse() を使用します(またはカスタムネットワークには実験的な defineNetwork() を使用します)
onUnhandledRequest: 'error'onUnhandledFrame: 'error' — リクエストと WebSocket 接続の両方を対象とします
カスタムコールバック (request, print)単一の { frame, defaults } オブジェクト。frame.protocol で絞り込み、defaults.warn() を呼び出します
server.events.on('connection', ...)server.events.on('websocket:connection', ...) — ライフサイクル API のみ。ws リンク独自の addEventListener('connection') の名前は変わりません
GraphQLLinkHandlers 型GraphQLLink に改名
msw の LifeCycleEventsMapmsw/experimental のプロトコル別マップ(HttpNetworkFrameEventMap、WebSocketNetworkFrameEventMap)
worker.stop() が void を返すPromise を返します — 実行中の重要なシナリオでは await worker.stop() を使用します

v3 の新機能:msw/vite プラグイン(ワーカースクリプトを提供するため、mockServiceWorker.js を public にコピーする必要がなくなります)、GraphQL v17 と link-first サブスクリプション、WebSocket Extension API、ページ遷移とフォーム送信のインターセプト、passthrough リクエストヘッダーの変更、小さなバンドル向けのユーティリティごとの msw/utils/* モジュール。

参考資料

参考資料内容
handler-api.mdhttp.* および graphql.* メソッド、URL 判定関数、パスパラメーター
response-api.mdHttpResponse クラス、すべての静的メソッド、Cookie の処理
server-api.mdsetupServer/setupWorker、ライフサイクルイベント、boundary()
test-patterns.mdVitest/Jest のセットアップ、オーバーライド、並行実行時の分離、キャッシュのクリア
migration-v1-to-v2.mdv1 から v2 への破壊的変更と移行ガイドの全内容
migration-v2-to-v3.mdv2 から v3 への破壊的変更、新しい API、移行ガイドの全内容
anti-patterns.mdよくある 10 の間違いと、BAD/GOOD の例

コメント