Hoy vamos a aprender cómo podemos instalar Vitest en un entorno de React con Vite.

Lo primero que haremos es instalar Vitest:
npm install -D vitest
Después instalaremos las librerías necesarias:
npm install vitest @testing-library/react @testing-library/jest-dom --save-dev
Ahora vamos a crear la estructura de carpetas para los tests, fuera de nuestra carpeta src:
tests -----unit ---------components
Y dentro de componentes vamos a crear un componente de ejemplo para testear que llamaremos Button.tsx:
import React, { ReactNode, MouseEventHandler } from 'react';
interface ButtonProps {
onClick: MouseEventHandler<HTMLButtonElement>;
children: ReactNode;
}
function Button({ onClick, children }: ButtonProps) {
return (
<button onClick={onClick}>
{children}
</button>
);
}
export default Button;
Ahora vamos a crear la prueba asociada, dentro de tests/components/ creamos
Boton.test.tsx
import { test, expect } from 'vitest';
import React from 'react';
import Button from './Button';
test('Button renders correctly', () => {
const button = <Button onClick={() => {}}>Click me</Button>;
expect(button).not.toBeNull();
});
test('Button onClick event works', () => {
let clicked = false;
const onClickMock = () => { clicked = true; };
const button = <Button onClick={onClickMock}>Click me</Button>;
button.props.onClick(); // Simulate click event
expect(clicked).toBe(true);
});
Y ahora para ejecutar los tests vamos a añadir dentro de package.json el siguiente script:
"test": "vitest run --coverage"
Si lo queremos sin que genere el coverage tendremos que poner solo:
"test": "vitest run"
Para implementar test que comprueben que nuestro componente se está renderizando dentro del document, tenemos que instalar lo siguiente:
La librería de testing-library de react.
npm install --save-dev @testing-library/react
Configuración para Vitest
npm install --save-dev @vitest/config
Ahora creamos un archivo llamado vitest.config.ts o vitest.config.js (si no usamos TypeScript)
import { defineConfig } from 'vitest/config'
export default defineConfig({
test: {
environment: 'jsdom', // Set the test environment to jsdom
},
});
Ahora debemos importar al principio de nuestros archivos:
import '@testing-library/jest-dom/vitest';
Y ahora el codigo quedaria asi:
import '@testing-library/jest-dom/vitest';
import { expect, test,afterEach } from 'vitest';
import React from 'react';
import Button from './Button';
import { render,cleanup } from '@testing-library/react';
// Limpia los componentes después de cada prueba
afterEach(cleanup);
test('Button renders correctly', () => {
const button = <Button onClick={() => {}}>Click me</Button>;
expect(button).not.toBeNull();
});
test('Button renders 2 correctly', () => {
const { getByText } = render(<Button onClick={() => {}}>Click me</Button>);
const buttonElement = getByText('Click me');
expect(buttonElement).toBeInTheDocument();
});
test('Button onClick event works', () => {
let clicked = false;
const onClickMock = () => { clicked = true; };
const button = <Button onClick={onClickMock}>Click me</Button>;
button.props.onClick(); // Simulate click event
expect(clicked).toBe(true);
});
Extra, añadir coverage a sonarqube.
Para establecer el coverage tenemos que crear el formato lcov.info.
Para ello tneemos que ir a vitest.config.ts
import { defineConfig } from 'vitest/config'
export default defineConfig({
test: {
environment: 'jsdom', // Set the test environment to jsdom
coverage: {
reporter: ['text', 'lcov']
}
},
});
Y ahora generará el archivo correspondiente cuando ejecutemos los tests:
npm test
Dentro de coverage estará este archivo:

Y ahora dentro de sonar-project.properties
sonar.javascript.lcov.reportPaths=coverage/lcov.info

Ingeniero en Informática, Investigador, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.