MSW ile Asenkron Arayüzü ve API Çağrılarını Test Etme
Veri getiren bileşenleri test etmek için HTTP isteklerini Mock Service Worker ile taklit edin.
MSW ile Asenkron Arayüzü ve API Çağrılarını Test Etme, CoddyKit'te ücretsiz bir React Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, React Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. React Academy kursu toplamda 4 dersten oluşur.
Mock Service Worker neden kullanılır?
MSW, bir hizmet çalışanı (tarayıcı) veya http aracısı (Node) kullanarak HTTP isteklerini ağ düzeyinde yakalar ve uygulama kodunuza dokunmadan API'leri taklit etmenizi sağlar.
MSW kurulumu
MSW'yi yükleyin ve Jest/Vitest testleri için Node aracısını ayarlayın.
// npm install msw --save-dev
// src/mocks/handlers.ts
import { http, HttpResponse } from 'msw';
export const handlers = [
http.get('/api/users', () => {
return HttpResponse.json([{ id: 1, name: 'Alice' }]);
}),
];Sahte sunucuyu ayarlama
İşleyicilerinizle bir setupServer örneği oluşturun; testlerden önce server.listen(), her testten sonra server.resetHandlers() ve tüm testlerden sonra server.close() çağırın.
import { setupServer } from 'msw/node';
import { handlers } from './handlers';
const server = setupServer(...handlers);
beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());Veri getiren bir bileşeni test etme
Veri getirme işlemini başlatan bileşeni oluşturun. MSW isteği yakalar ve sahte veriler döndürür. Veriler yüklendikten sonra kullanıcının gördüklerini doğrulayın.
test('shows user list after fetch', async () => {
render(<UserList />);
expect(screen.getByText('Loading...')).toBeInTheDocument();
expect(await screen.findByText('Alice')).toBeInTheDocument();
});Eşzamansız kullanıcı arayüzü için findBy sorguları
findBy sorguları, öğe göründüğünde sonuçlanan bir değer döndürür (varsayılan olarak en fazla 1 saniyelik zaman aşımıyla). Bunları eşzamansız işlemlerden sonra görünen içerikler için kullanın.
// findByText waits for the element to appear
const username = await screen.findByText('Alice');
expect(username).toBeInTheDocument();
// waitFor wraps assertions that need to wait
await waitFor(() => {
expect(screen.getByText('3 users')).toBeInTheDocument();
});Her testte işleyicileri geçersiz kılma
Yalnızca ilgili testin varsayılan işleyicisini geçersiz kılan tek kullanımlık bir işleyici eklemek için testin içinde server.use() kullanın.
test('shows error on API failure', async () => {
server.use(
http.get('/api/users', () => {
return HttpResponse.json({ message: 'Server error' }, { status: 500 });
})
);
render(<UserList />);
expect(await screen.findByText('Failed to load users')).toBeInTheDocument();
});Yüklenme durumlarını test etme
Yüklenme göstergesini, eşzamansız veriler gelmeden önce, oluşturma işleminden hemen sonra (eşzamanlı olarak) doğrulayın.
test('shows loading state initially', () => {
render(<UserList />);
expect(screen.getByRole('progressbar')).toBeInTheDocument();
// or
expect(screen.getByText('Loading...')).toBeInTheDocument();
});POST İsteklerini Test Etme
İstek gövdesini doğrulayan ve oluşturulan kaynağı döndüren bir POST işleyicisi tanımlayın. Bileşenin başarılı durumu yansıttığını doğrulayın.
server.use(
http.post('/api/users', async ({ request }) => {
const body = await request.json();
return HttpResponse.json({ id: 2, ...body }, { status: 201 });
})
);
test('creates a user', async () => {
const user = userEvent.setup();
render(<NewUserForm />);
await user.type(screen.getByLabelText('Name'), 'Bob');
await user.click(screen.getByRole('button', { name: /create/i }));
expect(await screen.findByText('User created!')).toBeInTheDocument();
});Gerçekçi Testler için Ağ Gecikmeleri
MSW'nin delay yardımcı programını kullanarak işleyicilere yapay gecikmeler ekleyin ve yüklenme kullanıcı arayüzünü daha kapsamlı test edin.
import { delay } from 'msw';
http.get('/api/users', async () => {
await delay(200);
return HttpResponse.json([{ id: 1, name: 'Alice' }]);
})React Query ile Test Etme
Durumun testler arasında sızmasını önlemek için bileşeni her testte yeni bir QueryClientProvider içine sarın.
function renderWithQuery(ui: React.ReactElement) {
const queryClient = new QueryClient({
defaultOptions: { queries: { retry: false } },
});
return render(
<QueryClientProvider client={queryClient}>{ui}</QueryClientProvider>
);
}İstek Verilerini Doğrulama
Uygulamanın doğru istek gövdesini veya başlıklarını gönderdiğini doğrulamak için bir işleyicinin içinde istek izleyicisi kullanın.
let capturedBody: unknown;
server.use(
http.post('/api/login', async ({ request }) => {
capturedBody = await request.json();
return HttpResponse.json({ token: 'abc' });
})
);
test('sends credentials to API', async () => {
// ... submit form ...
expect(capturedBody).toEqual({ email: 'a@b.com', password: 'pass' });
});Geliştirme için Tarayıcıda MSW
MSW geliştirme sırasında tarayıcıda da çalışır. Hizmet çalışanını kurmak için npx msw init public/ komutunu çalıştırın ve yerel geliştirme sırasında sahte bir API kullanmak için işleyicilerinizi main.tsx dosyasına içe aktarın.
Hızlı Kontrol
Bir API çağrısı tamamlandıktan sonra görünen içeriği doğrulamak için hangi RTL sorgu türünü kullanmalısınız?
Özet
MSW, gerçek HTTP isteklerini yakalayarak canlı bir sunucuya bağlanmadan testleri gerçekçi hâle getirir. Test başına işleyicileri geçersiz kılmak için server.use(), eşzamansız doğrulamalar için findBy kullanın ve React Query testlerini yeni bir QueryClientProvider içine sarın.
Sıkça Sorulan Sorular
“MSW ile Asenkron Arayüzü ve API Çağrılarını Test Etme” dersi ücretsiz mi?
Evet — “MSW ile Asenkron Arayüzü ve API Çağrılarını Test Etme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve React Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. React Academy kursu toplamda 4 dersten oluşur.
“MSW ile Asenkron Arayüzü ve API Çağrılarını Test Etme” dersinde ne öğreneceğim?
Veri getiren bileşenleri test etmek için HTTP isteklerini Mock Service Worker ile taklit edin. React Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
React Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te React Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“MSW ile Asenkron Arayüzü ve API Çağrılarını Test Etme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu React Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her React Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- React Testing Library ile Entegrasyon Testleri
- MSW ile Asenkron Arayüzü ve API Çağrılarını Test Etme
- React için Playwright'a Başlangıç
- Formları ve Kullanıcı Akışlarını Uçtan Uca Test Etme