Introducció
En aquest tema, aprendrem a realitzar proves unitàries en aplicacions React utilitzant Jest, un marc de proves JavaScript desenvolupat per Facebook. Jest és àmpliament utilitzat per la seva facilitat d'ús, velocitat i integració amb React.
Objectius
- Comprendre què són les proves unitàries.
- Configurar Jest en un projecte React.
- Escriure i executar proves unitàries bàsiques amb Jest.
- Aprendre a utilitzar les funcionalitats avançades de Jest per a proves més complexes.
Què són les proves unitàries?
Les proves unitàries són proves automàtiques que verifiquen el funcionament correcte de les unitats més petites del codi, com ara funcions o components individuals. L'objectiu és assegurar-se que cada unitat funcioni correctament de manera aïllada.
Configuració de Jest en un projecte React
Pas 1: Instal·lació de Jest
Si has creat el teu projecte React utilitzant Create React App, Jest ja està preconfigurat. Si no, pots instal·lar Jest manualment:
Pas 2: Configuració del script de proves
Afegeix el següent script al teu package.json
per executar les proves amb Jest:
Pas 3: Instal·lació de Babel (opcional)
Si utilitzes sintaxi moderna de JavaScript, com ara les importacions d'ES6, necessitaràs Babel per compilar el codi durant les proves:
Afegeix un fitxer .babelrc
a l'arrel del teu projecte amb la següent configuració:
Escriure i executar proves unitàries bàsiques amb Jest
Exemple 1: Provar una funció simple
Suposem que tenim una funció sum
en un fitxer sum.js
:
Podem escriure una prova per aquesta funció en un fitxer sum.test.js
:
// sum.test.js import { sum } from './sum'; test('adds 1 + 2 to equal 3', () => { expect(sum(1, 2)).toBe(3); });
Per executar la prova, utilitza el següent comandament:
Exemple 2: Provar un component React
Suposem que tenim un component Button
en un fitxer Button.js
:
// Button.js import React from 'react'; export function Button({ label }) { return <button>{label}</button>; }
Podem escriure una prova per aquest component en un fitxer Button.test.js
:
// Button.test.js import React from 'react'; import { render } from '@testing-library/react'; import { Button } from './Button'; test('renders button with label', () => { const { getByText } = render(<Button label="Click me" />); expect(getByText('Click me')).toBeInTheDocument(); });
Funcionalitats avançades de Jest
Mocking
Jest permet simular (mock) funcions, mòduls i temporitzadors per aïllar les unitats de codi durant les proves.
Exemple: Simular una funció
// fetchData.js export const fetchData = () => { return Promise.resolve('data'); }; // fetchData.test.js import { fetchData } from './fetchData'; jest.mock('./fetchData'); test('fetchData returns data', async () => { fetchData.mockResolvedValue('mocked data'); const data = await fetchData(); expect(data).toBe('mocked data'); });
Proves asíncrones
Jest facilita la prova de codi asíncron utilitzant promeses o la sintaxi async/await
.
Exemple: Provar una funció asíncrona
// asyncFunction.js export const asyncFunction = async () => { return 'async data'; }; // asyncFunction.test.js import { asyncFunction } from './asyncFunction'; test('asyncFunction returns async data', async () => { const data = await asyncFunction(); expect(data).toBe('async data'); });
Exercicis pràctics
Exercici 1: Provar una funció de multiplicació
Crea una funció multiply
que multipliqui dos nombres i escriu una prova per verificar el seu funcionament.
Solució
// multiply.js export function multiply(a, b) { return a * b; } // multiply.test.js import { multiply } from './multiply'; test('multiplies 2 * 3 to equal 6', () => { expect(multiply(2, 3)).toBe(6); });
Exercici 2: Provar un component amb un esdeveniment
Crea un component ToggleButton
que canviï el seu estat intern quan es fa clic i escriu una prova per verificar aquest comportament.
Solució
// ToggleButton.js import React, { useState } from 'react'; export function ToggleButton() { const [isOn, setIsOn] = useState(false); return ( <button onClick={() => setIsOn(!isOn)}> {isOn ? 'ON' : 'OFF'} </button> ); } // ToggleButton.test.js import React from 'react'; import { render, fireEvent } from '@testing-library/react'; import { ToggleButton } from './ToggleButton'; test('toggles button text on click', () => { const { getByText } = render(<ToggleButton />); const button = getByText('OFF'); fireEvent.click(button); expect(button).toHaveTextContent('ON'); });
Conclusió
En aquest tema, hem après a configurar Jest en un projecte React, escriure proves unitàries bàsiques i utilitzar funcionalitats avançades com el mocking i les proves asíncrones. Les proves unitàries són una eina essencial per assegurar la qualitat del codi i facilitar el manteniment de les aplicacions React.
En el següent tema, explorarem com realitzar proves de components amb React Testing Library per assegurar-nos que els nostres components es comporten correctament en diferents situacions.
Curs de React
Mòdul 1: Introducció a React
- Què és React?
- Configuració de l'entorn de desenvolupament
- Hola Món en React
- JSX: Extensió de la sintaxi de JavaScript
Mòdul 2: Components de React
- Comprendre els components
- Components funcionals vs components de classe
- Props: Passar dades als components
- State: Gestionar l'estat del component
Mòdul 3: Treballar amb esdeveniments
- Gestionar esdeveniments en React
- Renderització condicional
- Llistes i claus
- Formularis i components controlats
Mòdul 4: Conceptes avançats de components
- Elevar l'estat
- Composició vs herència
- Mètodes del cicle de vida de React
- Hooks: Introducció i ús bàsic
Mòdul 5: Hooks de React
Mòdul 6: Enrutament en React
Mòdul 7: Gestió de l'estat
- Introducció a la gestió de l'estat
- API de context
- Redux: Introducció i configuració
- Redux: Accions i reductors
- Redux: Connexió amb React
Mòdul 8: Optimització del rendiment
- Tècniques d'optimització del rendiment de React
- Memorització amb React.memo
- Hooks useMemo i useCallback
- Divisió de codi i càrrega mandrosa
Mòdul 9: Proves en React
- Introducció a les proves
- Proves unitàries amb Jest
- Proves de components amb React Testing Library
- Proves de punta a punta amb Cypress
Mòdul 10: Temes avançats
- Renderització del costat del servidor (SSR) amb Next.js
- Generació de llocs estàtics (SSG) amb Next.js
- TypeScript amb React
- React Native: Construir aplicacions mòbils