Back to 🧪 Testing & Monitoring

Setup API Mocking with MSW

TestingMSWAPIMocking
---
description: Mock API requests for testing and development
---

1. **Install MSW**:
- Mock Service Worker for API mocking.
// turbo
- Run npm install --save-dev msw@latest

2. **Initialize MSW**:
- Generate service worker file.
// turbo
- Run npx msw init public/ --save

3. **Create Handlers**:
- Define mock API responses.
// mocks/handlers.ts
import { http, HttpResponse } from 'msw';

export const handlers = [
http.get('/api/user', () => {
return HttpResponse.json({
id: '1',
name: 'John Doe',
email: '[email protected]',
});
}),

http.post('/api/login', async ({ request }) => {
const { email } = await request.json() as { email: string };

if (email === '[email protected]') {
return HttpResponse.json({ token: 'fake-jwt-token' });
}

return new HttpResponse(null, { status: 401 });
}),
];


4. **Setup Browser Worker**:
- Enable mocking in browser.
// mocks/browser.ts
import { setupWorker } from 'msw/browser';
import { handlers } from './handlers';

export const worker = setupWorker(...handlers);


5. **Start MSW in Development**:
- Create a provider to conditionally start MSW.
// app/msw-provider.tsx
'use client'
import { useEffect, useState } from 'react';

export function MSWProvider({ children }: { children: React.ReactNode }) {
const [mswReady, setMswReady] = useState(false);

useEffect(() => {
async function init() {
if (process.env.NODE_ENV === 'development') {
const { worker } = await import('../mocks/browser');
await worker.start({
onUnhandledRequest: 'bypass',
});
setMswReady(true);
} else {
setMswReady(true);
}
}

init();
}, []);

if (!mswReady) return null;
return <>{children}</>;
}

- Add to layout:
// app/layout.tsx
import { MSWProvider } from './msw-provider';

export default function RootLayout({ children }) {
return (
<html>
<body>
<MSWProvider>{children}</MSWProvider>
</body>
</html>
);
}


6. **Use in Tests**:
- Setup for Vitest/Jest.
// vitest.setup.ts
import { afterAll, afterEach, beforeAll } from 'vitest';
import { setupServer } from 'msw/node';
import { handlers } from './mocks/handlers';

const server = setupServer(...handlers);

beforeAll(() => server.listen({ onUnhandledRequest: 'error' }));
afterEach(() => server.resetHandlers());
afterAll(() => server.close());


7. **Pro Tips**:
- Use MSW to develop frontend before backend is ready.
- Override handlers per test for different scenarios.
- MSW works with fetch, axios, and any HTTP client.
- The browser worker only runs in development mode.
By Antigravity Team

How to Use This Workflow

Option A: Project-Specific (Recommended)

  1. Click "Download" above
  2. In your project, create the directory: .agent/workflows/
  3. Save the file as setup-api-mocking-msw-service-worker.md
  4. In Antigravity, type /setup_api_mocking_msw_service_worker or just describe what you want to do

Learn more about workflows →

Related Workflows

Recommended Rules

View more rules →

Recommended MCP Servers

View more MCP servers →

Take It Further

Maximize your productivity with these powerful resources

📋

Define Your Standards

Set up coding standards to ensure this workflow produces consistent, high-quality results.

Browse Rules Library
📖

Master Workflows

Learn how to create custom workflows, use Turbo Mode, and build your automation library.

Complete Guide