Debounce, setTimeout veya async işlemler içeren bir bileşeni nasıl test edersiniz?
Cevap
Zamanlayıcılar için fake timers, async UI güncellemeleri için ise RTL'in **findBy* / waitFor** yardımcıları kullanılır. Testte gerçek süre beklemek (sleep(500)) testleri yavaş ve kararsız (flaky) yapar.
Fake timers ile debounce testi (Vitest)
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
beforeEach(() => vi.useFakeTimers());
afterEach(() => vi.useRealTimers());
test("arama 300 ms debounce edilir", async () => {
const onSearch = vi.fn();
// userEvent kendi içinde bekleme yapar; fake timer'ı ilerletmesini söyleriz
const user = userEvent.setup({ advanceTimers: vi.advanceTimersByTime });
render(<SearchBox onSearch={onSearch} />);
await user.type(screen.getByRole("searchbox"), "react");
expect(onSearch).not.toHaveBeenCalled();
await vi.advanceTimersByTimeAsync(300);
expect(onSearch).toHaveBeenCalledTimes(1);
expect(onSearch).toHaveBeenCalledWith("react");
});Async UI
// findBy* = waitFor + getBy; varsayılan 1000 ms boyunca tekrar dener
expect(await screen.findByText("Kaydedildi")).toBeInTheDocument();
// Bir şeyin kaybolmasını beklemek
await waitForElementToBeRemoved(() => screen.queryByText("Yükleniyor..."));Sık hatalar
getByile async içerik aramak: eleman henüz yoktur, test düşer.waitForiçine yan etki (tıklama) koymak; içinde sadece assertion olmalı.- "not wrapped in act(...)" uyarısını görmezden gelmek: genelde bir async güncellemenin beklenmediğini gösterir. Çözüm
actsarmak değil, doğru şeyifindBy/waitForile beklemektir. - Fake timer'ı açık bırakmak; diğer testleri etkiler,
afterEach'teuseRealTimersçağırın. - Custom hook'ları test etmek için
renderHookkullanın (@testing-library/react).
İlgili Test soruları
- Playwright ile E2E testlerinde flaky (kararsız) testleri nasıl önlersiniz?
- Testlerde mock, stub ve spy arasındaki fark nedir? Ne zaman mock kullanmamalısınız?
- React Testing Library'nin felsefesi nedir? Örnek bir test yazın.
- Unit, integration ve end-to-end (E2E) test arasındaki fark nedir?
- Production'da sadece bazı kullanıcılarda oluşan bir frontend hatasını nasıl tespit edip çözersiniz?
- Frontend testlerinde API çağrılarını nasıl mock'larsınız? MSW (Mock Service Worker) neden tercih edilir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.