Episode ini mengajarkan pengujian komponen React: integrasi dengan React Testing Library, merender komponen dan memeriksa output DOM, menguji event, props, perubahan state, serta UI async, dan menggabungkan snapshot testing untuk komponen.

Jest lahir dari ekosistem React dan tetap menjadi pasangan paling natural untuk menguji komponen. Episode 8 mengajarkan cara menguji UI components dengan kombinasi Jest dan React Testing Library — pendekatan yang berfokus pada perilaku yang terlihat pengguna, bukan detail implementasi internal.
Kalian akan belajar merender komponen, memeriksa output DOM, menguji event dan perubahan state, menangani UI yang memuat data secara async, serta menggabungkan snapshot testing untuk komponen. Semua dilakukan di lingkungan jsdom tanpa browser nyata, sehingga suite tetap cepat dan deterministik.
Untuk menguji React, ubah testEnvironment menjadi jsdom agar objek DOM tersedia. Install paket yang dibutuhkan:
npm install --save-dev @testing-library/react @testing-library/jest-dom @testing-library/user-eventPaket @testing-library/react menyediakan fungsi render, @testing-library/jest-dom menambah matchers DOM seperti toBeInTheDocument, dan @testing-library/user-event meniru interaksi pengguna secara realistis.
import "@testing-library/jest-dom";Cukup import sekali di file setupFilesAfterEnv agar matchers tersedia di semua file test — detail konfigurasi ini akan dibahas di episode 11.
Fungsi render memuat komponen ke dalam DOM virtual, lalu kalian memeriksa hasilnya dengan query seperti getByText dan getByRole:
import { render, screen } from "@testing-library/react";
function Sapa({ nama }) {
return <h1>Halo, {nama}</h1>;
}
test("menampilkan sapaan", () => {
render(<Sapa nama="arif" />);
expect(screen.getByText("Halo, arif")).toBeInTheDocument();
});screen.getByText("Halo, arif") mencari elemen yang teksnya persis cocok, dan matcher toBeInTheDocument dari jest-dom memastikan elemen itu ada di DOM. Prioritaskan query yang menyerupai cara pengguna menemukan elemen — getByRole dan getByLabelText lebih baik daripada query berbasis class.
Dengan user-event, kalian bisa mengklik, mengetik, dan menunggu reaksi komponen:
import userEvent from "@testing-library/user-event";
import { render, screen } from "@testing-library/react";
import { useState } from "react";
function Penghitung() {
const [hitung, setHitung] = useState(0);
return (
<button onClick={() => setHitung((n) => n + 1)}>
Ditekan {hitung} kali
</button>
);
}
test("klik menaikkan penghitung", async () => {
const user = userEvent.setup();
render(<Penghitung />);
const tombol = screen.getByRole("button");
await user.click(tombol);
await user.click(tombol);
expect(tombol).toHaveTextContent("Ditekan 2 kali");
});userEvent.setup() membuat instance interaksi, lalu user.click(tombol) meniru klik nyata termasuk event mousedown dan mouseup. Assertion toHaveTextContent memeriksa bahwa state yang dirender benar-benar berubah setelah dua klik.
Uji perilaku yang berbeda dengan props berbeda. Contoh: tombol dinonaktifkan saat prop disabled bernilai true, atau teks berubah sesuai prop. Setiap kombinasi props yang bermakna layak menjadi satu test tersendiri.
Komponen yang memuat data dari API biasanya menampilkan loading lalu hasilnya. Untuk menunggu, gunakan findBy yang mengembalikan promise:
import { render, screen } from "@testing-library/react";
async function AmbilData() {
const data = await Promise.resolve({ pesan: "dimuat" });
return <div>{data.pesan}</div>;
}
test("menampilkan data setelah dimuat", async () => {
render(<AmbilData />);
expect(screen.getByText("dimuat")).toBeInTheDocument();
});Untuk komponen yang benar-benar melakukan fetch, kalian akan meng-mock fetch atau modul API — teknik yang akan kita bahas mendalam di episode 12. Untuk sekarang, ingat bahwa findByText menunggu secara internal sampai elemen muncul atau timeout, sehingga ideal untuk UI async.
Kombinasikan render dan snapshot untuk memantau perubahan struktur:
test("struktur kartu stabil", () => {
const { container } = render(<Kartu judul="Berita" isi="Isi berita" />);
expect(container).toMatchSnapshot();
});Snapshot React menangkap seluruh DOM yang dirender. Gunakan secara selektif: snapshot untuk struktur yang jarang berubah, dan assertion eksplisit untuk perilaku interaktif. Kombinasi keduanya memberi proteksi menyeluruh tanpa membuat suite kaku.
Episode 8 membekali kalian pengujian UI components yang berpusat pada perilaku: integrasi React Testing Library, render dan query DOM, interaksi pengguna dengan user-event, penanganan UI async, serta snapshot untuk struktur komponen.
Inti yang harus dibawa pulang:
testEnvironment: "jsdom" untuk menguji komponen React.getByRole dan getByText mengikuti cara pengguna melihat.user-event meniru interaksi nyata; pakai setup() untuk instance baru.findBy menunggu elemen async muncul di DOM.Di episode 9 selanjutnya kita akan menangani TypeScript & Babel support — menjalankan Jest dengan TypeScript, mengonfigurasi ts-jest atau Babel, memetakan source paths dan module aliases, serta menguji kode yang bertipe dengan benar.