Menguji UI Asinkron & Pemanggilan API dengan MSW
Tirukan permintaan HTTP dengan Mock Service Worker untuk menguji komponen yang mengambil data.
Menguji UI Asinkron & Pemanggilan API dengan MSW adalah pelajaran React Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar React Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus React Academy mencakup 4 pelajaran total.
Mengapa Mock Service Worker?
MSW mencegat permintaan HTTP pada tingkat jaringan menggunakan pekerja layanan (peramban) atau pencegat http (Node), sehingga Anda dapat menyimulasikan API tanpa menyentuh kode aplikasi.
Memasang MSW
Pasang MSW dan siapkan pencegat Node untuk pengujian Jest/Vitest.
// 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' }]);
}),
];Menyiapkan Peladen Simulasi
Buat instans setupServer dengan handlers Anda, lalu panggil server.listen() sebelum pengujian, server.resetHandlers() setelah setiap pengujian, dan server.close() setelah semua pengujian selesai.
import { setupServer } from 'msw/node';
import { handlers } from './handlers';
const server = setupServer(...handlers);
beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());Menguji Komponen yang Mengambil Data
Tampilkan komponen yang memicu pengambilan data. MSW mencegat permintaan dan mengembalikan data simulasi. Verifikasi hal yang dilihat pengguna setelah data dimuat.
test('shows user list after fetch', async () => {
render(<UserList />);
expect(screen.getByText('Loading...')).toBeInTheDocument();
expect(await screen.findByText('Alice')).toBeInTheDocument();
});Kueri findBy untuk Antarmuka Pengguna Asinkron
Kueri findBy mengembalikan janji yang terselesaikan ketika elemen muncul (dengan batas waktu 1 detik secara bawaan). Gunakan kueri ini untuk konten yang muncul setelah operasi asinkron.
// 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();
});Mengganti handlers pada Setiap Pengujian
Gunakan server.use() di dalam pengujian untuk menambahkan penangan sekali pakai yang menggantikan bawaan hanya untuk pengujian tersebut.
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();
});Menguji Keadaan Pemuatan
Verifikasi indikator pemuatan segera setelah komponen ditampilkan (secara sinkron), sebelum data asinkron tiba.
test('shows loading state initially', () => {
render(<UserList />);
expect(screen.getByRole('progressbar')).toBeInTheDocument();
// or
expect(screen.getByText('Loading...')).toBeInTheDocument();
});Pengujian Permintaan POST
Tentukan penangan POST yang memvalidasi isi permintaan dan mengembalikan sumber daya yang dibuat. Pastikan komponen mencerminkan keadaan berhasil.
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();
});Penundaan Jaringan untuk Pengujian yang Realistis
Tambahkan penundaan buatan ke penangan untuk menguji antarmuka pengguna saat memuat secara lebih menyeluruh, menggunakan utilitas delay milik MSW.
import { delay } from 'msw';
http.get('/api/users', async () => {
await delay(200);
return HttpResponse.json([{ id: 1, name: 'Alice' }]);
})Pengujian dengan React Query
Bungkus komponen dengan QueryClientProvider baru untuk setiap pengujian agar keadaan tidak bocor di antara pengujian.
function renderWithQuery(ui: React.ReactElement) {
const queryClient = new QueryClient({
defaultOptions: { queries: { retry: false } },
});
return render(
<QueryClientProvider client={queryClient}>{ui}</QueryClientProvider>
);
}Memastikan Data Permintaan
Gunakan fungsi pemantau permintaan di dalam penangan untuk memverifikasi bahwa aplikasi mengirim isi permintaan atau tajuk yang benar.
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' });
});MSW di Peramban untuk Pengembangan
MSW juga berfungsi di peramban selama pengembangan. Jalankan npx msw init public/ untuk memasang pekerja layanan dan impor penangan Anda dalam main.tsx agar tersedia API tiruan selama pengembangan lokal.
Cek Singkat
Jenis kueri RTL apa yang sebaiknya Anda gunakan untuk memverifikasi konten yang muncul setelah panggilan API selesai?
Ringkasan
MSW mencegat permintaan HTTP nyata, sehingga pengujian tetap realistis tanpa mengakses server aktif. Gunakan server.use() untuk mengganti penangan per pengujian, findBy untuk verifikasi asinkron, dan bungkus pengujian React Query dalam QueryClientProvider baru.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menguji UI Asinkron & Pemanggilan API dengan MSW” gratis?
Ya — teks lengkap “Menguji UI Asinkron & Pemanggilan API dengan MSW” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus React Academy, upgrade ke CoddyKit PRO. Kursus React Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Menguji UI Asinkron & Pemanggilan API dengan MSW”?
Tirukan permintaan HTTP dengan Mock Service Worker untuk menguji komponen yang mengambil data. Kamu berlatih React Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai React Academy?
Tidak diperlukan pengalaman sebelumnya. React Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Menguji UI Asinkron & Pemanggilan API dengan MSW” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran React Academy ini?
Ya. Setiap pelajaran React Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pengujian Integrasi dengan React Testing Library
- Menguji UI Asinkron & Pemanggilan API dengan MSW
- Memulai dengan Playwright untuk React
- Menguji Formulir & Alur Pengguna dari Awal hingga Akhir