Izolacja logiki serwerowej bywa trudna. Zobacz, jak sprawnie zastępować połączenia z bazą danych i API w Vitest oraz kiedy odpuścić na rzecz testów E2E.
Maciej Sala
Founder StriveLab
3 min czytaniaOpublikowano 10 kwietnia 2026 (Aktualizacja 4 czerwca 2026)
Problem: asynchroniczne Server Components w Next.js trudno testować jednostkowo
W praktyce oznacza to, że dla asynchronicznych oficjalna dokumentacja Next.js nadal rekomenduje zamiast prób pełnego renderowania ich w Vitest czy Jest. Testy jednostkowe oczywiście wciąż mają sens, ale trzeba je przesunąć poziom niżej, czyli do funkcji pomocniczych, funkcji pobierających dane, walidacji i synchronicznej warstwy widoku.
Trzy strategie testowania Server Components
Strategia 1: testuj logikę, nie cały Server Component
Zamiast renderować Server Component w teście, po prostu wyciągnij logikę (pobieranie danych, transformacje, walidację) do osobnych funkcji i testuj je w izolacji.
To najskuteczniejszą strategią jest testowanie 80% logiki bez konieczności renderowania komponentu.
Strategia 2: rozdziel asynchroniczne pobieranie danych od synchronicznej warstwy widoku
Zamiast próbować renderować cały asynchroniczny Server Component, wydziel warstwę pobierania danych i osobny komponent prezentacyjny. Wtedy testujesz jednostkowo to, co jest stabilne: transformację danych i renderowanie widoku z właściwości.
Taki podział daje dwa zyski: testy jednostkowe są stabilne, a asynchroniczną integrację ze środowiskiem uruchomieniowym Next.js pokrywasz E2E.
Strategia 3: mockowanie API Next.js w testach
Server Components często korzystają z cookies() i headers(). W Next.js 15+ to API jest asynchroniczne, więc podstawienia w testach też powinny zwracać Promise. params i searchParams najczęściej po prostu przekazujesz jako właściwości do testowanej funkcji pomocniczej lub widoku.
Przetestuj funkcje takie jak calculateDiscount, logikę showUpgradePrompt czy formatowanie ceny. Zamiast renderować cały komponent, wydziel logikę biznesową i przetestuj ją bezpośrednio.
Czy React Testing Library obsługuje Server Components?
Pośrednio i z ograniczeniami. Dla synchronicznych komponentów albo wydzielonej warstwy widoku renderowanie w JSDOM działa poprawnie. Dla asynchronicznych Server Components oficjalna dokumentacja Next.js nadal sugeruje E2E, bo Vitest i Jest nie odwzorowują pełnego środowiska uruchomieniowego App Routera — streamingu, granic Suspense ani zachowania frameworka wokół cookies() i headers().
Jaki procent pokrycia testami ma sens dla Server Components?
Celuj w 70–80% pokrycia logiki biznesowej, czyli funkcji w lib/, serwisów i funkcji pomocniczych. Objęcie komponentów w 100% mija się z celem, bo większość Server Components tylko wyświetla dane. Wartość testu rośnie tam, gdzie pojawia się warunek, transformacja danych lub przypadek brzegowy.
Co konkretnie wyciągnąć z komponentu, żeby dało się to testować?
Pobieranie danych, transformacje i walidację przenieś do osobnych funkcji w lib/, a renderowanie z właściwości do synchronicznego komponentu prezentacyjnego. Asynchroniczny Server Component zostaje wtedy cienkim spoiwem, które tylko woła funkcję pobierającą dane i przekazuje wynik do widoku — i to spoiwo pokrywasz E2E, a nie testem jednostkowym.
Jak podstawiać cookies() i headers() w testach Next.js 15 i nowszych?
Te API są asynchroniczne, więc podstawienie w teście musi zwracać Promise, dlatego używaj vi.fn(async () => ...) albo mockResolvedValue. Podstawienie cookies() zwraca obiekt z metodą get, a headers() instancję Headers. redirect() i notFound() najlepiej podstawić tak, by rzucały błąd, który łapiesz w asercji rejects.toThrow.
Vitest czy Jest do testowania Next.js?
Vitest, ponieważ działa natywnie z ESM, ma szybszy tryb obserwowania zmian i lepiej integruje się z narzędziami Vite, a API jest kompatybilne z Jest, więc migracja jest prosta. Dla nowych projektów Next.js nie ma dziś powodu zaczynać od Jest.
O autorze
Maciej Sala
Maciej Sala — konsultant technologiczny produktów cyfrowych i web developer z bogatym doświadczeniem w marketingu internetowym oraz SEO. Na co dzień pracuje z Reactem, Next.js i TypeScriptem, a ostatnio także z Astro i narzędziami do automatyzacji procesów AI. Sprawnie łączy perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat był związany z branżą gier wideo jako project manager i game designer. Absolwent historii na Uniwersytecie Jagiellońskim oraz studiów podyplomowych z marketingu internetowego na AGH w Krakowie. Po godzinach trenuje na siłowni, maluje figurki i rozwija własne projekty.
Server Actions to publiczne endpointy POST, które każdy może wywołać z poziomu narzędzi deweloperskich, narzędzia curl lub skryptu, dlatego formularza w interfejsie nie wolno traktować jak granicy bezpieczeństwa. Jeśli akcja nie waliduje danych wejściowych i nie sprawdza uprawnień, staje się podatna na ataki. Testy pilnują, aby niezweryfikowane dane nie trafiły do bazy, niezalogowany użytkownik nie wykonał niedozwolonej modyfikacji, a rewalidacja oraz inne efekty uboczne uruchomiły się dopiero po pomyślnym zakończeniu operacji.
Maciej Sala
Founder StriveLab
Przez lata React pchał, coraz więcej i więcej pracy do przeglądarki, w efekcie czego mamy większe bundle, hydratacja trwa dłużej, są puste loadingi i strony, które bez JavaScriptu straciły sens. App Router odwraca ten kierunek. React Server Components pozwalają renderować treść na serwerze bez wysyłania całej logiki do klienta, a Server Actions upraszczają formularze i mutacje. To ma znaczenie dla SEO, bo crawler szybciej dostaje HTML. Ma też znaczenie dla biznesu, bo użytkownik szybciej widzi i dostaje to, po co przyszedł.
Maciej Sala
Founder StriveLab
Cypress Component Testing w React i Next.js bez marketingowej mgły. Kiedy daje przewagę nad RTL, jak go skonfigurować i gdzie kończą się jego możliwości.