React
Vitest: setup di un progetto React in dieci minuti
Vitest entra in un progetto React con tre pacchetti e un blocco in vite.config.js: ambiente jsdom, setup di jest-dom e un comando per la CI.
In sintesi
- Tre pacchetti e un blocco test in vite.config.js bastano per partire.
- setupFiles carica jest-dom una volta per tutta la suite.
- npx vitest run è la forma da usare in CI; npx vitest resta in watch.
Un progetto React passa a Vitest con tre pacchetti e un blocco di configurazione: ambiente jsdom, setup di jest-dom e un comando unico per locale e CI.
I pacchetti
npm i -D vitest jsdom @testing-library/react @testing-library/jest-dom
Vitest, Vite e jsdom sono distribuiti con licenza MIT. La configurazione vive in vite.config.js: non serve un secondo bundler né un file separato.
Il blocco di configurazione
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
export default defineConfig({
plugins: [react()],
test: {
environment: "jsdom",
globals: true,
setupFiles: "./src/test/setup.js",
},
});
Il blocco test lo legge solo Vitest, Vite lo ignora in build. setupFiles carica jest-dom una volta per tutti i test, invece di importarlo in ogni file.
Il file di setup
import "@testing-library/jest-dom/vitest";
import { cleanup } from "@testing-library/react";
import { afterEach } from "vitest";
afterEach(() => cleanup());
L'import di jest-dom aggiunge i matcher come toBeInTheDocument; con globals: true i file di test non importano test e expect.
Il primo test
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { LoginForm } from "./LoginForm";
test("mostra l'errore con email vuota", async () => {
render( {}} />);
await userEvent.click(screen.getByRole("button", { name: "Accedi" }));
expect(screen.getByRole("alert")).toHaveTextContent("Email obbligatoria");
});
Il comando npx vitest run esegue una volta ed esce con codice zero o uno: è la forma che serve in CI, mentre npx vitest resta in ascolto.
Record vivi nel catalogo
Tre componenti su cui provare la suite: login-form, input e multistep-form. Per sfogliare per categoria parti da 111.985 componenti.
La limitazione
jsdom non applica CSS e non calcola il layout: un test verde non dice se il componente si vede. Per quello serve un browser vero, con Playwright.
Dove continuare
Il quadro dei cinque test è in Testing Library: cinque test; come si legge una documentazione è in documentazione React; il confronto misurato fra librerie React è in librerie React 2026.
Domande frequenti
Quanto tempo serve per il setup?
Dieci minuti su un progetto Vite: tre pacchetti, un blocco di configurazione e un file di setup.
Serve jsdom?
Sì per i componenti React, che usano il DOM. Per funzioni pure basta l'ambiente node.
Vitest sostituisce Jest?
Nella pratica sì: stessa API di test, ma gira su Vite e legge la configurazione del progetto.
Come si esegue in CI?
Con npx vitest run: esegue una volta, non resta in watch e restituisce un codice di uscita.
Posso tenere i test accanto ai componenti?
Sì, è la convenzione predefinita: Vitest cerca i file con punto test o punto spec.