mcpField
M
msw

msw

github.com/anivar测试与质量1175 次安装2 周前更新
代码仓库

关于 msw

MSW 是面向使用 Mock Service Worker 的开发者的技能,用于在测试、Storybook 和本地开发中模拟网络层 API。其规则涵盖当前 API、初始化、请求处理和测试模式。

主要功能

  1. 01拦截 HTTP、GraphQL、SSE 和 WebSocket
  2. 02处理器与响应构造规则
  3. 03测试生命周期与覆盖模式
  4. 04v1 到 v2、v2 到 v3 迁移指南

适用场景

  1. 01为前端或 Node.js 集成测试模拟 API
  2. 02在 Storybook 中提供模拟 API
  3. 03无后端时进行本地开发
  4. 04检查并更新 MSW 版本迁移代码

安装

复制下面的命令,在终端中运行。

$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(浏览器 worker)
无后端的本地开发MSW(浏览器 worker)
对纯函数进行单元测试普通测试替身
对真实 API 进行端到端测试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使用 ({ request, params, cookies }),而非 (req, res, ctx)
v2 响应构建handler-response-v2.md使用 HttpResponse.json(),而非 res(ctx.json())
设置与生命周期(严重)
规则文件摘要
正确的导入路径setup-import-paths.md服务端使用 msw/node,worker 使用 msw/browser
生命周期钩子setup-lifecycle-hooks.md始终使用 beforeAll/afterEach/afterAll 模式
文件组织setup-file-organization.md在 src/mocks/ 中组织 handlers、node 和 browser 文件
请求读取(高)
规则文件摘要
在事件中克隆请求request-clone-events.md在生命周期事件中读取请求体前先克隆请求
异步读取请求体request-body-async.md始终执行 await request.json()——读取请求体是异步操作
响应构建(高)
规则文件摘要
Cookie 使用 HttpResponseresponse-use-httpresponse.md原生 Response 会丢弃 Set-Cookie,请使用 HttpResponse
网络错误response-error-network.md使用 HttpResponse.error();不要抛出普通 Error
流式传输response-streaming.mdServer-Sent Events 使用 sse();分块传输使用 ReadableStream
测试模式(高)
规则文件摘要
测试行为test-behavior-not-requests.md断言 UI/状态,而非 fetch 调用参数
每个测试单独覆盖test-override-with-use.md对错误和边缘情况测试使用 server.use()
并发隔离test-concurrent-boundary.md将并发测试包装在 server.boundary() 中
未处理的请求test-unhandled-request.md设置 onUnhandledFrame: 'error'
GraphQL(中)
规则文件摘要
响应结构graphql-response-shape.md通过 HttpResponse.json 返回 { data } / { errors }
端点范围限定graphql-scope-with-link.md多个 GraphQL API 请使用 graphql.link(url)
实用工具(中)
规则文件摘要
bypass 与 passthroughutil-bypass-vs-passthrough.mdbypass() = 新建请求;passthrough() = 放行请求
延迟行为util-delay-behavior.md在 Node.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.params来自解析器信息的 params
req.bodyawait request.json()
req.cookies来自解析器信息的 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 为先: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 link 自身的 addEventListener('connection') 保持原名
GraphQLLinkHandlers 类型重命名为 GraphQLLink
来自 msw 的 LifeCycleEventsMap来自 msw/experimental 的按协议划分的映射(HttpNetworkFrameEventMap、WebSocketNetworkFrameEventMap)
worker.stop() 返回 void返回 Promise——对于有进行中关键任务的场景,请使用 await worker.stop()

v3 新增:msw/vite 插件(用于提供 worker 脚本——无需再将 mockServiceWorker.js 复制到 public 目录)、GraphQL v17 和 link 优先的订阅、WebSocket 扩展 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.md10 个常见错误及 BAD/GOOD 示例

评论

支持 Markdown