Frontend testlerinde API çağrılarını nasıl mock'larsınız? MSW (Mock Service Worker) neden tercih edilir?
Cevap
fetch'i veya axios'u doğrudan vi.mock ile taklit etmek, testi uygulamanın iç detaylarına bağlar. MSW ise isteği ağ seviyesinde yakalar: uygulama kodu gerçek fetch çağrısı yapar, MSW sahte bir HTTP cevabı döner. Bu sayede HTTP istemcisini değiştirseniz bile testler bozulmaz ve aynı mock'lar hem testlerde (Node) hem tarayıcıda (geliştirme, Storybook) kullanılabilir.
// mocks/handlers.ts (MSW v2)
import { http, HttpResponse } from "msw";
export const handlers = [
http.get("/api/users/:id", ({ params }) =>
HttpResponse.json({ id: params.id, name: "Ayşe" })
),
];// vitest.setup.ts
import { setupServer } from "msw/node";
import { handlers } from "./mocks/handlers";
export const server = setupServer(...handlers);
beforeAll(() => server.listen({ onUnhandledRequest: "error" }));
afterEach(() => server.resetHandlers());
afterAll(() => server.close());// UserCard.test.tsx
test("hata durumunda mesaj gösterir", async () => {
server.use(
http.get("/api/users/:id", () => new HttpResponse(null, { status: 500 }))
);
render(<UserCard id="1" />);
expect(await screen.findByRole("alert")).toHaveTextContent("Bir hata oluştu");
});
test("kullanıcı adını gösterir", async () => {
render(<UserCard id="1" />);
expect(await screen.findByText("Ayşe")).toBeInTheDocument();
});İyi pratikler
onUnhandledRequest: "error"ile mock'lanmamış istekleri yakalayın.- Her testten sonra
resetHandlersile test bazlı override'ları temizleyin. - Hata, boş liste, yavaş cevap (
await delay(2000)) gibi durumları test bazındaserver.useile kurun. - TanStack Query kullanıyorsanız her test için yeni bir
QueryClientoluşturun veretry: falseverin; aksi hâlde cache testler arasında sızar ve hata testleri retry yüzünden yavaşlar.
İlgili Test soruları
- Playwright ile E2E testlerinde flaky (kararsız) testleri nasıl önlersiniz?
- Testlerde mock, stub ve spy arasındaki fark nedir? Ne zaman mock kullanmamalısınız?
- React Testing Library'nin felsefesi nedir? Örnek bir test yazın.
- Unit, integration ve end-to-end (E2E) test arasındaki fark nedir?
- Production'da sadece bazı kullanıcılarda oluşan bir frontend hatasını nasıl tespit edip çözersiniz?
- Debounce, setTimeout veya async işlemler içeren bir bileşeni nasıl test edersiniz?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.