Menguji Antara Muka Tak Segerak & Panggilan API dengan MSW
Tiru permintaan HTTP dengan Mock Service Worker untuk menguji komponen yang mengambil data.
Menguji Antara Muka Tak Segerak & Panggilan API dengan MSW ialah pelajaran React Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran React Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus React Academy merangkumi sejumlah 4 pelajaran.
Mengapa Pekerja Perkhidmatan Tiruan?
MSW memintas permintaan HTTP pada peringkat rangkaian menggunakan Pekerja Perkhidmatan (pelayar) atau pemintas http (Node), membolehkan anda meniru API tanpa menyentuh kod aplikasi.
Memasang MSW
Pasang MSW dan sediakan pemintas Node untuk ujian 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' }]);
}),
];Menyediakan Pelayan Tiruan
Cipta tika setupServer dengan pengendali anda dan panggil server.listen() sebelum ujian, server.resetHandlers() selepas setiap ujian dan server.close() selepas semua ujian.
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
Paparkan komponen yang mencetuskan pengambilan data. MSW memintas permintaan tersebut dan mengembalikan data tiruan. Buat penegasan terhadap perkara yang dilihat oleh pengguna selepas data dimuatkan.
test('shows user list after fetch', async () => {
render(<UserList />);
expect(screen.getByText('Loading...')).toBeInTheDocument();
expect(await screen.findByText('Alice')).toBeInTheDocument();
});Pertanyaan findBy untuk Antara Muka Pengguna Tak Segerak
Pertanyaan findBy mengembalikan janji yang diselesaikan apabila elemen muncul (sehingga had masa satu saat secara lalai). Gunakannya untuk kandungan yang muncul selepas operasi tak segerak.
// 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();
});Mengatasi Pengendali bagi Setiap Ujian
Gunakan server.use() di dalam ujian untuk menambah pengendali sekali guna yang mengatasi lalai bagi ujian itu sahaja.
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
Buat penegasan terhadap penunjuk pemuatan sejurus selepas paparan (secara segerak), sebelum data tak segerak tiba.
test('shows loading state initially', () => {
render(<UserList />);
expect(screen.getByRole('progressbar')).toBeInTheDocument();
// or
expect(screen.getByText('Loading...')).toBeInTheDocument();
});Menguji Permintaan POST
Tentukan pengendali POST yang mengesahkan badan permintaan dan mengembalikan sumber yang telah dicipta. Buat penegasan bahawa komponen mencerminkan keadaan berjaya.
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();
});Kelewatan Rangkaian untuk Ujian Realistik
Tambahkan kelewatan buatan pada pengendali untuk menguji antara muka pemuatan dengan lebih menyeluruh menggunakan utiliti delay MSW.
import { delay } from 'msw';
http.get('/api/users', async () => {
await delay(200);
return HttpResponse.json([{ id: 1, name: 'Alice' }]);
})Menguji dengan React Query
Bungkus komponen dalam QueryClientProvider baharu bagi setiap ujian untuk mengelakkan keadaan terbocor antara ujian.
function renderWithQuery(ui: React.ReactElement) {
const queryClient = new QueryClient({
defaultOptions: { queries: { retry: false } },
});
return render(
<QueryClientProvider client={queryClient}>{ui}</QueryClientProvider>
);
}Membuat Penegasan terhadap Data Permintaan
Gunakan perisik permintaan dalam pengendali untuk mengesahkan bahawa aplikasi menghantar badan atau pengepala permintaan yang betul.
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 dalam Pelayar untuk Pembangunan
MSW juga berfungsi dalam pelayar semasa pembangunan. Jalankan npx msw init public/ untuk memasang pekerja perkhidmatan dan mengimport pengendali anda dalam main.tsx bagi menyediakan API tiruan semasa pembangunan setempat.
Semakan Pantas
Jenis pertanyaan RTL yang manakah patut digunakan untuk membuat penegasan terhadap kandungan yang muncul selepas panggilan API selesai?
Imbas Kembali
MSW memintas permintaan HTTP sebenar, menjadikan ujian realistik tanpa menghubungi pelayan langsung. Gunakan server.use() untuk mengatasi pengendali bagi setiap ujian, findBy untuk penegasan tak segerak, dan bungkus ujian React Query dalam QueryClientProvider baharu.
Pelajari React dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 88
- Pelajaran
- 324
Soalan Lazim
Adakah pelajaran “Menguji Antara Muka Tak Segerak & Panggilan API dengan MSW” percuma?
Ya — teks penuh “Menguji Antara Muka Tak Segerak & Panggilan API dengan MSW” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus React Academy, tingkat taraf kepada CoddyKit PRO. Kursus React Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Menguji Antara Muka Tak Segerak & Panggilan API dengan MSW”?
Tiru permintaan HTTP dengan Mock Service Worker untuk menguji komponen yang mengambil data. Anda berlatih React Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan React Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran React Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Menguji Antara Muka Tak Segerak & Panggilan API dengan MSW” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran React Academy ini?
Ya. Setiap pelajaran React Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Pengujian Integrasi dengan React Testing Library
- Menguji Antara Muka Tak Segerak & Panggilan API dengan MSW
- Bermula dengan Playwright untuk React
- Menguji Borang & Aliran Pengguna dari Hujung ke Hujung