| name | msw-fetch-mock |
| description | MSW v2 patterns for API mocking in Vitest tests. Use when setting up API mocks, writing HTTP handlers, simulating network errors, or configuring msw/node for component and integration tests.
|
MSW v2 for Vitest
Setup
import { http, HttpResponse } from 'msw'
export const handlers = [
http.get('/api/users', () => HttpResponse.json([{ id: 1, name: 'John' }])),
]
import { setupServer } from 'msw/node'
import { handlers } from './handlers'
export const server = setupServer(...handlers)
import { server } from './src/mocks/server'
beforeAll(() => server.listen())
afterEach(() => server.resetHandlers())
afterAll(() => server.close())
Handler Patterns
import { http, HttpResponse } from 'msw'
http.get('/api/users', () => HttpResponse.json([{ id: 1 }]))
http.post('/api/users', async ({ request }) => {
const body = await request.json()
return HttpResponse.json({ id: 2, ...body }, { status: 201 })
})
http.get('/api/users/:id', ({ params }) => HttpResponse.json({ id: params.id }))
http.get('/api/me', ({ cookies }) => HttpResponse.json({ token: cookies.session }))
Other: HttpResponse.text(), .html(), .xml(), .formData(), .arrayBuffer().
Per-Test Override
it('shows error on 500', async () => {
server.use(
http.get('/api/user', () => HttpResponse.json({ error: 'fail' }, { status: 500 }))
)
})
Network Error
http.get('/api/data', () => HttpResponse.error())
v1 → v2 Migration Summary
| v1 | v2 |
|---|
rest.get(url, (req, res, ctx) => res(ctx.json(x))) | http.get(url, () => HttpResponse.json(x)) |
Import rest from msw | Import http, HttpResponse from msw |
req.body auto-parsed | await request.json() (standard Request API) |
(req, res, ctx) triple-arg | Single { request, params, cookies } object |
Gotchas
- No auto-parsing: must call
await request.json() explicitly
- Use
HttpResponse over native Response for MSW features (cookie mocking)
server.resetHandlers() only clears runtime overrides; initial handlers persist
- Don't assert on intercepted requests — assert on UI/application behavior