Jest 30TypeScriptUnit TestsIntegration TestsMockingReact Testing LibraryCoverageGitHub ActionsClaude Code
Automatisierte Tests sind 2026 kein Nice-to-have mehr — sie sind das Fundament jedes professionellen TypeScript-Projekts. Jest 30 hat mit nativem ESM-Support, stark verbesserter Leistung und einer überarbeiteten Konfigurations-API einen neuen Standard gesetzt. Claude Code beschleunigt das Schreiben vollständiger Test-Suiten dramatisch: von der ersten jest.config.ts bis zum letzten Coverage-Bericht.
Dieser Artikel zeigt praxisnahe Muster für alle wichtigen Jest-Bereiche — mit echtem TypeScript-Code, den Claude Code täglich generiert.
Voraussetzungen: Node.js 20+, TypeScript 5.x, ein bestehendes npm/pnpm-Projekt. Alle Codebeispiele sind direkt aus realen Claude-Code-Sessions entnommen.
1. Jest Setup & Grundlagen
Ein sauberes Jest-Setup mit TypeScript beginnt mit der richtigen Konfiguration. Claude Code legt immer jest.config.ts statt jest.config.js an — das bringt vollständige Typsicherheit in der Konfiguration selbst.
Installation & jest.config.ts
# Installation (pnpm)pnpm add -D jest ts-jest @types/jest
pnpm add -D jest-environment-jsdom # für Browser-Tests
Mocking ist das Herzstück von Unit Tests. Claude Code wählt dabei immer das richtige Werkzeug: jest.mock für ganze Module, jest.fn für einzelne Funktionen und jest.spyOn wenn das originale Verhalten erhalten bleiben soll.
Claude Code Faustregeln: jest.mock() für externe Dependencies (Datenbank, HTTP, Filesystem). jest.fn() für Dependency Injection. jest.spyOn() wenn du sicherstellen willst, dass echte Implementierung in anderen Tests weiterläuft.
3. Timer & Module Mocks
TimerModule
Zeitabhängige Tests — Debounce, Retry-Logik, Timeouts — sind ohne Fake-Timers extrem fragil. Claude Code setzt jest.useFakeTimers konsequent für alle zeitabhängigen Tests ein.
jest.useFakeTimers
// src/__tests__/debounce.test.tsimport { debounce } from'@/utils/debounce';
describe('debounce', () => {
beforeEach(() => {
jest.useFakeTimers();
});
afterEach(() => {
jest.useRealTimers(); // IMMER zurücksetzen!
});
it('führt Funktion erst nach Wartezeit aus', () => {
constcallback = jest.fn();
constdebouncedFn = debounce(callback, 500);
debouncedFn('erster Aufruf');
debouncedFn('zweiter Aufruf');
debouncedFn('dritter Aufruf');
// Noch nicht ausgeführtexpect(callback).not.toHaveBeenCalled();
// Timer um 499ms vorspulen — noch immer nicht!jest.advanceTimersByTime(499);
expect(callback).not.toHaveBeenCalled();
// Exakt 500ms — jetzt wird's ausgeführtjest.advanceTimersByTime(1);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith('dritter Aufruf');
});
it('Retry-Logik mit exponential backoff', async () => {
constfailingApi = jest.fn()
.mockRejectedValueOnce(new Error('Fehler 1'))
.mockRejectedValueOnce(new Error('Fehler 2'))
.mockResolvedValue({ data: 'Erfolg' });
constresultPromise = retryWithBackoff(failingApi, { maxRetries: 3 });
// Ersten Retry nach 1000ms auslösenawaitjest.advanceTimersByTimeAsync(1000);
// Zweiten Retry nach 2000msawaitjest.advanceTimersByTimeAsync(2000);
constresult = awaitresultPromise;
expect(result.data).toBe('Erfolg');
expect(failingApi).toHaveBeenCalledTimes(3);
});
});
__mocks__ Folder — Automatische Mocks
Für Module die in vielen Tests gemockt werden, erstellt Claude Code immer einen __mocks__-Ordner. Jest lädt diese Mocks automatisch.
// In Tests: automatisch gecachter Mockjest.mock('@/lib/prisma');
importprismafrom'@/lib/prisma';
import type { DeepMockProxy } from'@/lib/prisma';
constprismaMock = prisma as unknown asDeepMockProxy<PrismaClient>;
it('findet Benutzer in der Datenbank', async () => {
prismaMock.user.findUnique.mockResolvedValue({
id: '1',
email: 'test@test.de',
createdAt: newDate(),
});
constuser = awaitfindUserById('1');
expect(user?.email).toBe('test@test.de');
});
jest.isolateModules — Frischer Modul-Zustand
it('Singleton verhält sich korrekt bei erstem Aufruf', () => {
jest.isolateModules(() => {
// Frischer Import — Singleton noch nicht initialisiertconst { getConfig } = require('@/config');
process.env.NODE_ENV = 'test';
constconfig = getConfig();
expect(config.env).toBe('test');
});
});
4. Snapshot Tests
Snapshot
Snapshot Tests sichern serialisierbare Outputs ab. Claude Code nutzt sie für React-Komponenten, serialisierte API-Responses und komplexe Konfigurationsobjekte — aber nie als Ersatz für aussagekräftige Assertions.
# Snapshots aktualisieren nach bewusster Änderungnpx jest --updateSnapshot
npx jest -u # Kurzform# Nur spezifische Test-Dateinpx jest breadcrumb.test.tsx --updateSnapshot
Achtung: Snapshots für dynamische Inhalte (Timestamps, IDs) müssen vor dem Snapshot normalisiert werden, sonst schlagen Tests nach jedem Lauf fehl. Claude Code nutzt dafür immer expect.any(String) oder manuelle Normalisierung.
5. React Testing Library
RTLAccessibility
React Testing Library (RTL) hat sich 2026 endgültig als Standard für React-Komponenten-Tests durchgesetzt. Das Grundprinzip: Tests sollen das Nutzerverhalten widerspiegeln, nicht die Implementierung. Claude Code generiert RTL-Tests, die ausschließlich über User-zugängliche Queries arbeiten.
Coverage-Reports ohne CI-Integration sind wertlos. Claude Code richtet immer Coverage-Schwellen und GitHub Actions Reporting ein — als Teil des initialen Test-Setups, nicht als nachträglicher Gedanke.
Unit Tests (70%): Eine Funktion, ein Verhalten, vollständiges Mocking
Integration Tests (20%): Mehrere Module zusammen, echte DB in Docker
E2E Tests (10%): Playwright, echte Browser-Flows, kein Jest
Naming:[was].test.ts für Units, [was].integration.test.ts
Ort:src/__tests__/ oder neben der Quell-Datei (*.spec.ts)
Parallele Test-Ausführung optimieren
// jest.config.ts — Performance-Optimierungconstconfig: Config = {
// Worker-Zahl: CPU-Kerne - 1 (lässt Ressourcen für OS)
maxWorkers: '50%',
// Nur geänderte Dateien (lokal)// --onlyChanged Flag statt Konfiguration bevorzugen// Cache zwischen Runs
cacheDirectory: '/tmp/jest-cache',
// Lange Tests früh erkennen
slowTestThreshold: 5, // Warnung ab 5 Sekunden// Bail bei erstem Fehler (CI-Modus)
bail: process.env.CI === 'true' ? 1 : 0,
};
Fazit: Claude Code als Test-Partner
Jest 30 mit TypeScript, React Testing Library und einer soliden CI-Pipeline ist 2026 der Standard für ernsthafte Frontend- und Backend-Projekte. Die Muster in diesem Artikel entstammen direkt aus dem Alltag mit Claude Code — einem KI-Assistenten, der nicht nur Code schreibt, sondern auch die dazugehörigen Tests.
Claude Code erkennt dabei systematisch, welche Testmuster für welche Situation passen: Fake-Timer für zeitabhängige Logik, Module-Mocks für externe Dependencies, RTL für Komponenten-Verhalten. Das Ergebnis sind Test-Suiten, die tatsächlich als Sicherheitsnetz funktionieren — nicht nur als Coverage-Metrik.
Nächste Schritte: Playwright für E2E-Tests, Storybook für Component-Isolation, Vitest als schnelle Alternative zu Jest für ESM-intensive Projekte — Claude Code unterstützt alle diese Setups und generiert vollständige Konfigurationen auf Anfrage.
Claude Code im eigenen Projekt testen
Vollständige Test-Suiten, Coverage-Reports und CI-Konfigurationen — Claude Code generiert das in Minuten statt Stunden. Jetzt 14-tägigen Trial starten.