vendredi 25 septembre 2026

À propos

Contact

Tests

Jest pour les blocs Gutenberg : tester vos composants React efficacement

Un bloc Gutenberg mal testé casse en silence à la moindre mise à jour de React ou de l'éditeur. Jest et Testing Library couvrent la logique et le rendu de vos composants.

Par Clément Hadrot • 12 janvier 2022 • 5 min de lecture • Aucun commentaire
Jest pour les blocs Gutenberg : tester vos composants React efficacement

Un bloc Gutenberg n’est jamais qu’un composant React, avec des fonctions edit et save, des contrôles dans la barre latérale, et parfois une logique de validation non triviale. Tester ce composant avec un test end-to-end complet, qui démarre un navigateur et une installation WordPress entière, fonctionne, mais reste lent et lourd pour vérifier une simple règle de rendu conditionnel. Jest, associé à Testing Library, permet de tester ce composant isolément, en quelques millisecondes par test.

Cet article détaille la mise en place de Jest sur un projet de blocs personnalisés, avec des exemples concrets de test de la fonction edit, des contrôles d’InspectorControls, et des pièges à éviter avec les snapshots.

Pourquoi Jest en complément des tests E2E

Les tests E2E avec Puppeteer, présentés dans un précédent article, valident qu’un bloc fonctionne réellement dans l’éditeur WordPress complet, avec toutes ses dépendances. Mais ils sont lents à écrire et à exécuter, et peu adaptés pour couvrir de nombreux cas limites d’un composant (props manquantes, valeurs invalides, états intermédiaires). Jest, en testant le composant React directement, sans monter tout l’éditeur, comble cet écart : une suite de cinquante tests Jest sur la logique d’un bloc s’exécute en quelques secondes, contre plusieurs minutes pour l’équivalent en E2E.

Installer Jest avec le préréglage WordPress

npm install --save-dev jest @wordpress/jest-preset-default @testing-library/react

Le paquet @wordpress/jest-preset-default configure automatiquement les transformations nécessaires pour JSX et les modules ES, ainsi que des mocks par défaut pour certains modules WordPress difficiles à charger tels quels dans un environnement de test Node.js. Un fichier jest.config.js dédié aux tests unitaires, distinct de la configuration E2E, ressemble à ceci :

module.exports = {
    preset: '@wordpress/jest-preset-default',
    testPathIgnorePatterns: [ '/node_modules/', '/tests/e2e/' ],
};
L'essentiel à retenir : Des tests de composants React sans navigateur ni serveur WordPress ; Testing Library pour interagir comme un vrai utilisateur ; Des snapshots à manier avec précaution

Tester la fonction edit d’un bloc

Supposons un bloc simple qui affiche un titre et un sous-titre modifiables. Sa fonction edit ressemble à ceci, simplifiée pour l’exemple :

export default function Edit( { attributes, setAttributes } ) {
    const { titre, sousTitre } = attributes;

    return (
        <div { ...useBlockProps() }>
            <RichText
                tagName="h2"
                value={ titre }
                onChange={ ( value ) => setAttributes( { titre: value } ) }
                placeholder="Titre de la section"
            />
            <RichText
                tagName="p"
                value={ sousTitre }
                onChange={ ( value ) => setAttributes( { sousTitre: value } ) }
                placeholder="Sous-titre"
            />
        </div>
    );
}

Avec Testing Library, on vérifie que les valeurs initiales s’affichent et que la saisie déclenche correctement setAttributes :

import { render, screen } from '@testing-library/react';
import Edit from '../edit';

describe( 'Bloc Section titrée - edit', () => {
    it( 'affiche le titre existant', () => {
        render(
            <Edit
                attributes={ { titre: 'Nos services', sousTitre: '' } }
                setAttributes={ jest.fn() }
            />
        );

        expect( screen.getByText( 'Nos services' ) ).toBeInTheDocument();
    } );
} );

Ce test ne dépend d’aucun serveur WordPress : il rend le composant React en mémoire, dans un DOM simulé par jsdom, et vérifie le résultat directement.

Tester une fonction de validation pure

La logique la plus rentable à couvrir en Jest reste souvent la logique pure, indépendante du rendu, par exemple une fonction qui valide les attributs d’un bloc avant sauvegarde :

export function estAttributsValides( attributes ) {
    return typeof attributes.titre === 'string' && attributes.titre.trim().length > 0;
}
import { estAttributsValides } from '../validation';

describe( 'estAttributsValides', () => {
    it( 'refuse un titre vide', () => {
        expect( estAttributsValides( { titre: '   ' } ) ).toBe( false );
    } );

    it( 'accepte un titre renseigné', () => {
        expect( estAttributsValides( { titre: 'Nos services' } ) ).toBe( true );
    } );
} );

Snapshots : un outil à manier avec précaution

Jest propose un mécanisme de snapshot testing, qui capture le rendu d’un composant et le compare à une version enregistrée précédemment. Séduisant à première vue, il pose un vrai risque sur des composants qui évoluent souvent : un développeur pressé finit par accepter aveuglément chaque nouveau snapshot avec jest --updateSnapshot, ce qui vide le test de tout son sens.

  • Réservez les snapshots à des composants stables, peu susceptibles de changer souvent.
  • Préférez des assertions explicites (getByText, getByRole) pour la logique qui compte vraiment.
  • Relisez systématiquement un diff de snapshot avant de l’accepter, plutôt que de le valider en masse.

Sur nos projets, nous limitons les snapshots aux blocs dont le HTML de sortie doit rester strictement stable pour des raisons de rétrocompatibilité de contenu. Pour tout le reste, une assertion explicite coûte à peine plus cher à écrire et reste bien plus lisible six mois plus tard.

En résumé

Jest et Testing Library comblent l’écart entre les tests end-to-end lourds et l’absence totale de test sur la logique d’un bloc Gutenberg. En couvrant la fonction edit, les contrôles associés et surtout la logique pure de validation, on obtient une suite rapide qui détecte l’essentiel des régressions avant même d’ouvrir un navigateur, tout en gardant les tests E2E pour les parcours critiques de bout en bout.

Partager :

À propos de l'auteur

Clément Hadrot

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi