mock-service-worker

Mocking

Mock'lar ile herhangi bir nedenle doğrudan kullanmak istemediğimiz veya kullanamadığımız bileşenleri simüle eder/taklit ederiz

Mock Service Worker ile API Mocking

Tipik bir örnek API'lerdir. Mocking sayesinde, henüz var olmayan bir API ile etkileşime geçebiliriz (örneğin backend ekibi

paralel olarak üzerinde çalışıyorsa) ve hangi verilerin döneceğini her zaman tam olarak biliriz.

Mock Service Worker bunun için çok güçlü ve popüler bir araçtır.

MSW Kurulumu

MSW'yi npm install --save-dev msw ile kuruyoruz

Handler Ts dosyasi olusturma

src/mock/handlers.ts dosyasını oluşturuyoruz. Burada bireysel rotalar mock'lanır.

Bu dosya örneğin şöyle görünebilir:

import { http, HttpResponse } from 'msw'
import { birds } from '../data/birds'
export const handlers = [
  // burada https://tolleapi.com/hello'ya gelen tüm GET isteklerini yakalıyoruz
  http.get('https://tolleapi.com/hello', () => {
    // ve onları {text: "Merhaba Dünya!"} nesnesiyle yanıtlıyoruz
    return HttpResponse.json({text: "Merhaba Dünya!"})
  }),
]

Bu kod, Mock Service Worker (MSW) kullanarak bir API'yi taklit etmek için bir handler tanımlar.

  • İlk olarak, MSW'den gerekli fonksiyonlar import edilir: http ve HttpResponse.
  • Ardından, handlers adında bir dizi oluşturulur. Bu dizi, taklit edilecek API rotalarını içerir.
  • Örnekte, https://tolleapi.com/hello adresine gelen GET istekleri yakalanır.
  • Bu isteğe karşılık olarak, {text: "Merhaba Dünya!"} şeklinde bir JSON yanıtı döndürülür.

Bu handler, gerçek bir API olmadan geliştirme yaparken kullanışlıdır. Örneğin, backend henüz hazır değilken frontend geliştirmesine devam etmek için bu tür mock'lar kullanılabilir. Ayrıca, testlerde tutarlı ve öngörülebilir API yanıtları sağlamak için de kullanılabilir.

Browser Dosyasi Olusturma

Sonra src/mock/browser.ts adında bir dosya daha oluşturuyoruz

Burada rotalarımız toplanır ve özellikle tarayıcıda kullanım için paketlenir

import { setupWorker } from 'msw/browser'
import { handlers } from './handlers'
export const worker = setupWorker(...handlers)

Bu kod, Mock Service Worker (MSW) kurulumunun bir parçasını oluşturuyor.

  • import { setupWorker } from 'msw/browser': MSW'nin tarayıcı sürümünden setupWorker fonksiyonunu import ediyor.
  • import { handlers } from './handlers': Daha önce tanımladığımız API mock handler'larını import ediyor.
  • export const worker = setupWorker(...handlers): setupWorker fonksiyonunu çağırarak bir MSW worker'ı oluşturuyor ve bunu handlers ile yapılandırıyor. Bu worker, tarayıcıda çalışacak ve belirtilen API isteklerini yakalayıp mock yanıtlar üretecek.

Bu kod, MSW'nin tarayıcı ortamında çalışması için gerekli olan temel yapılandırmayı sağlar.

Service worker oluşturma

Şimdi npx msw init ./public --save ile bir service worker oluşturuyoruz.

Bu, daha sonra gelen istekleri yakalayıp yeniden yazacak.

Artık MSW'yi entegre edebiliriz.

App’i mock data icin yeniden yapilandirma

Bunu App.tsx'te yapıyoruz, hem de React'i başlatmadan önce:

import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import App from "./App.tsx";
import "./index.css";

async function enableMocking() {
  if (process.env.NODE_ENV !== "development") {
    return;
  }
  const { worker } = await import("./mocks/browser");
  // `worker.start()` Service Worker'ın hazır olup istekleri yakalamaya başladığında
  // çözümlenen bir Promise döndürür.
  return worker.start();
}

enableMocking().then(() =>
  createRoot(document.getElementById("root")!).render(
    <StrictMode>
      <App />
    </StrictMode>
  )
);

1. Import İfadeleri

import { StrictMode } from "react";

import { createRoot } from "react-dom/client";

import App from "./App.tsx";

import "./index.css";

Bu ifadeler, React uygulamasının temel bileşenlerini ve stillerini import eder. StrictMode, geliştirme sırasında potansiyel sorunları tespit etmek için kullanılır. createRoot, React 18 ile gelen yeni bir render yöntemidir.

2. enableMocking Fonksiyonu

async function enableMocking() {
  if (process.env.NODE_ENV !== "development") {
    return;
  }
  const { worker } = await import("./mocks/browser");
  return worker.start();
}

Bu fonksiyon şunları yapar:

  • Ortam kontrolü yapar. Sadece geliştirme ortamında çalışır.
  • MSW worker'ını dinamik olarak import eder. Bu, developer build'inde gereksiz kod içermemek için önemlidir.
  • worker.start() çağrısı, Service Worker'ı başlatır ve API isteklerini yakalamaya hazır hale getirir.

process.env.NODE_ENV Açıklaması

process.env.NODE_ENV, Node.js uygulamalarında yaygın olarak kullanılan bir ortam değişkenidir. Bu değişken, uygulamanın hangi ortamda çalıştığını belirtir. Genellikle üç ana değer alır:

  • development: Geliştirme ortamını ifade eder. Bu modda genellikle hata ayıklama özellikleri etkindir.
  • production: Canlı ortamı ifade eder. Performans optimizasyonları etkindir ve hata ayıklama özellikleri devre dışıdır.
  • test: Test ortamını ifade eder. Otomatik testler çalıştırılırken kullanılır.

Kodumuzda, if (process.env.NODE_ENV !== "development") kontrolü, uygulamanın yalnızca geliştirme ortamında mock servisi kullanmasını sağlar. Bu, production ortamında gerçek API'ye bağlanılmasını garanti eder.

3. React Uygulamasının Başlatılması

enableMocking().then(() =>
  createRoot(document.getElementById("root")!).render(
    <StrictMode>
      <App />
    </StrictMode>
  )
);

Bu bölüm:

  • Önce enableMocking() fonksiyonunu çağırır ve tamamlanmasını bekler.
  • createRoot ile 'root' id'li DOM elementinde bir React kökü oluşturur.
  • StrictMode içinde App bileşenini render eder. StrictMode, potansiyel sorunları vurgulamak için bazı kontroller yapar ve uyarılar verir.

Bu yapı, MSW'nin React uygulaması başlamadan önce hazır olmasını sağlar. Böylece, uygulama başladığında yapılan API çağrıları hemen yakalanabilir ve mock edilebilir. Bu, gerçek bir backend olmadan frontend geliştirmesi yapılmasına olanak tanır ve API yanıtlarının kontrollü bir şekilde simüle edilmesini sağlar.

Sonuc

Artık her şey hazır olmalı ve ilgili rotaya yapılan bir fetch isteği bize "mock'lanmış" veriler döndürmeli

Github Repo:

https://github.com/snahmd/birdsift

Yorum yap