{"id":232145,"date":"2023-01-10T15:12:00","date_gmt":"2023-01-10T12:12:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232145"},"modified":"2022-11-10T07:48:28","modified_gmt":"2022-11-10T04:48:28","slug":"tests-unitaires-javascript-faciles-dans-wordpress-avec-jest","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/tests-unitaires-javascript-faciles-dans-wordpress-avec-jest\/","title":{"rendered":"Tests unitaires JavaScript faciles dans WordPress avec Jest"},"content":{"rendered":"\n<p>WordPress a une longue exp\u00e9rience des tests unitaires de son code PHP. Cependant, \u00e9crire des tests unitaires JavaScript et des tests d&rsquo;int\u00e9gration pour le code dans les th\u00e8mes et les plugins ne b\u00e9n\u00e9ficie pas du m\u00eame statut. Voyons comment tester le JavaScript dans nos plugins et th\u00e8mes WordPress en utilisant Jest.<\/p>\n<p>Voici le contenu que nous aborderons dans cet article\u00a0:<\/p>\n<h2>Tests unitaires JavaScript dans WordPress<\/h2>\n<p>Alors pourquoi \u00e9crire des tests unitaires et des tests d&rsquo;int\u00e9gration? Ils sont parfaits pour s&rsquo;assurer qu&rsquo;une fonction, une m\u00e9thode de classe ou m\u00eame un composant React fait ce qu&rsquo;il est cens\u00e9 faire. Il aide \u00e0 d\u00e9tecter les erreurs dans le code et aide \u00e9galement \u00e0 pr\u00e9server l&rsquo;int\u00e9grit\u00e9 lorsque des modifications sont introduites ult\u00e9rieurement dans le code en v\u00e9rifiant qu&rsquo;il fonctionne toujours comme pr\u00e9vu apr\u00e8s la mise \u00e0 jour.<\/p>\n<p><a href=\"https:\/\/startfunction.com\/category\/wordpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Les plugins et th\u00e8mes WordPress<\/a> sont principalement \u00e9crits en PHP et peuvent utiliser la suite PHPUnit pour ex\u00e9cuter des tests, faire des assertions, se moquer de fonctions et plus encore. Le manuel contient m\u00eame une section expliquant comment configurer rapidement <a href=\"https:\/\/make.wordpress.org\/cli\/handbook\/plugin-unit-tests\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">les tests unitaires avec le WP-CLI<\/a>.<\/p>\n<p>Pour JavaScript, il y a une page sur <a href=\"https:\/\/make.wordpress.org\/core\/handbook\/testing\/automated-testing\/qunit\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&rsquo;ex\u00e9cution des tests QUnit<\/a> dans le manuel, bien qu&rsquo;il s&rsquo;agisse davantage de tester le code JavaScript dans le noyau de WordPress.<\/p>\n<p>Bien que rien de tout cela ne soit standardis\u00e9 pour JavaScript dans WordPress, nous pouvons \u00e9crire d&rsquo;excellents tests unitaires \u00e0 l&rsquo;aide de la suite de tests Jest. Dans cet article, nous allons apprendre \u00e0 \u00e9crire des tests unitaires JavaScript pour un exemple de plugin qui charge 5 messages via l&rsquo;API WP REST en utilisant la <code>fetch<\/code>fonction de JavaScript et les restitue dans un certain \u00e9l\u00e9ment DOM de la page.<\/p>\n<h2>Avantages de l&rsquo;utilisation de Jest pour les tests unitaires JavaScript dans WordPress<\/h2>\n<p>Dans le pass\u00e9, \u00e9crire des tests unitaires JavaScript impliquait de configurer Mocha pour ex\u00e9cuter des tests, Chai pour faire des assertions et Sinon pour simuler des fonctions et les espionner. Bien qu&rsquo;ils offrent une grande flexibilit\u00e9, il est beaucoup plus complexe de travailler avec trois packages qu&rsquo;avec un seul. <a href=\"https:\/\/jestjs.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Jest<\/a> fournit tout cela dans un seul package\u00a0:<\/p>\n<ul>\n<li>vous pouvez ex\u00e9cuter des tests en les d\u00e9clarant avec <code>describe<\/code>et <code>it<\/code>ou<code>test<\/code><\/li>\n<li>vous pouvez faire des assertions avec <code>expect<\/code>et <code>toBe<\/code>, <code>toHaveLength<\/code>et bien d&rsquo;autres<\/li>\n<li>vous pouvez simuler des fonctions et les espionner, et il existe plusieurs fa\u00e7ons de le faire<\/li>\n<\/ul>\n<h3>Avant d&rsquo;avancer<\/h3>\n<p>Afin de garder cet article concentr\u00e9 sur les tests avec Jest, il existe une configuration suppl\u00e9mentaire externe au processus de test comme Babel ou Webpack qui ne sera pas couverte ici. Tout cela se trouve dans <a href=\"https:\/\/github.com\/eliorivero\/wp-jest-tests\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">le repo WP Jest Tests<\/a> qui accompagne cet article. Pour garder les choses contextuelles, chaque section sera li\u00e9e \u00e0 l&rsquo;un des fichiers pertinents que nous \u00e9crirons.<\/p>\n<h2>Vue d&rsquo;ensemble du c\u00f4t\u00e9 PHP<\/h2>\n<p>Le <a href=\"https:\/\/github.com\/eliorivero\/wp-jest-tests\/blob\/master\/wp-jest-tests.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP du plugin d&rsquo;exemple<\/a> que nous allons utiliser pour apprendre \u00e0 \u00e9crire les tests unitaires JavaScript est assez standard. Les seules lignes int\u00e9ressantes sont celles o\u00f9 nous mettons en file d&rsquo;attente notre fichier JavaScript et ajoutons un script en ligne pour lui transmettre des variables\u00a0:<\/p>\n<pre><code>$initial_state = rawurlencode( wp_json_encode( array(\n    'restUrl' =&gt; esc_url_raw( rest_url() ),\n    'posts'   =&gt; 5,)) );\nwp_enqueue_script( \n    'wp-jest-tests',\n    plugins_url( 'front.js', __FILE__ ),\n    array(),\n    $plugin_version,\n    true\n);\nwp_add_inline_script(\n    'wp-jest-tests',\n    'window.wpJestTests = JSON.parse(decodeURIComponent(\"'. $initial_state. '\"));',\n    'before'\n);<\/code><\/pre>\n<p>Apr\u00e8s avoir enqu\u00eat\u00e9 notre fichier JavaScript, nous ajoutons une variable globale <code>wpJestTests<\/code>avec <code>wp_add_inline_script()<\/code>. Cette variable est particuli\u00e8rement int\u00e9ressante et d\u00e9licate \u00e0 g\u00e9rer car elle est externe \u00e0 notre fichier JavaScript et nous devrons nous en moquer dans nos tests.<\/p>\n<h2>Mettre en place des tests Jest<\/h2>\n<p>Nous devrons d&rsquo;abord initialiser <code>npm<\/code>notre projet de plugin pour pouvoir installer Jest avec. Naviguez dans la ligne de commande jusqu&rsquo;au dossier de votre plugin et ex\u00e9cutez\u00a0:<\/p>\n<p><code>npm init<\/code>et passez par la s\u00e9rie d&rsquo;invites ici<\/p>\n<p>Modifiez le fichier <a href=\"https:\/\/github.com\/eliorivero\/wp-jest-tests\/blob\/master\/package.json\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">package.json<\/a> qui a \u00e9t\u00e9 cr\u00e9\u00e9 et ajoutez une nouvelle entr\u00e9e pour ex\u00e9cuter nos tests dans la <code>scripts<\/code>section\u00a0:<\/p>\n<p><code>\"test\": \"jest\"<\/code><\/p>\n<p>Ce sera la commande que nous utiliserons pour dire \u00e0 Jest d&rsquo;ex\u00e9cuter nos tests unitaires JavaScript. Il s&rsquo;agit d&rsquo;une ex\u00e9cution unique, mais Jest prend \u00e9galement en charge la surveillance des fichiers, vous pouvez donc en saisir une suppl\u00e9mentaire\u00a0:<\/p>\n<p><code>\"test-watch\": \"jest --watch\"<\/code><\/p>\n<p>Installez maintenant Jest en tant que d\u00e9pendance de d\u00e9veloppement en ex\u00e9cutant<\/p>\n<p><code>npm install -D jest<\/code><\/p>\n<p>Pendant l&rsquo;installation, cr\u00e9ez un fichier nomm\u00e9 <code>jest.config.js<\/code>. Cela contiendra toute la configuration n\u00e9cessaire. Ajoutez ce qui suit\u00a0:<\/p>\n<pre><code>module.exports = {\n    verbose: true,\n    setupFiles: [\n        '\/__mocks__\/globals.js'\n    ],\n    moduleNameMapper: {\n        '.(css|less|sass|scss)$': '\/__mocks__\/styleMock.js'\n   }\n};<\/code><\/pre>\n<p>Passons en revue chacun\u00a0:<\/p>\n<ul>\n<li><code>verbose<\/code>: indique si chaque test individuel doit \u00eatre signal\u00e9 pendant l&rsquo;ex\u00e9cution. Toutes les erreurs seront \u00e9galement toujours affich\u00e9es en bas apr\u00e8s l&rsquo;ex\u00e9cution. Notez que s&rsquo;il n&rsquo;y a qu&rsquo;un seul fichier de test en cours d&rsquo;ex\u00e9cution, il est par d\u00e9faut <code>true<\/code>.<\/li>\n<li><code>setupFiles<\/code>: une liste de chemins vers des modules qui ex\u00e9cutent du code pour configurer ou mettre en place l&rsquo;environnement de test. Chaque setupFile sera ex\u00e9cut\u00e9 une fois par fichier de test. \u00c9tant donn\u00e9 que chaque test s&rsquo;ex\u00e9cute dans son propre environnement, ces scripts seront ex\u00e9cut\u00e9s dans l&rsquo;environnement de test imm\u00e9diatement avant d&rsquo;ex\u00e9cuter le code de test lui-m\u00eame. Nous l&rsquo;utiliserons pour d\u00e9clarer des variables globales rendues par PHP et WordPress avec des commandes telles que <code>wp_add_inline_script<\/code>ou <code>wp_localize_script<\/code>.<\/li>\n<li><code>moduleNameMapper<\/code>: il s&rsquo;agit d&rsquo;un mappage d&rsquo;expressions r\u00e9guli\u00e8res vers des noms de modules (ou des tableaux de noms de modules) qui permettent de supprimer des ressources statiques, comme des images ou des styles avec un seul module.<\/li>\n<\/ul>\n<p>Vous avez s\u00fbrement remarqu\u00e9 la r\u00e9f\u00e9rence: il s&rsquo;agit d&rsquo;un jeton sp\u00e9cial qui est remplac\u00e9 par Jest par la racine de votre projet, qui est g\u00e9n\u00e9ralement l&#8217;emplacement de votre fichier <code>package.json<\/code>.<\/p>\n<p>Nous irons en profondeur dans les deux sections suivantes, mais d&rsquo;abord, cr\u00e9ez le dossier et ces deux fichiers r\u00e9f\u00e9renc\u00e9s ci-dessus\u00a0:<\/p>\n<ul>\n<li>cr\u00e9er un dossier nomm\u00e9<code>__mocks__<\/code><\/li>\n<li>dans le dossier, cr\u00e9ez les fichiers <code>styleMock.js<\/code>et<code>globals.js<\/code><\/li>\n<\/ul>\n<h2>Importation de styles fictifs pour les tests Jest<\/h2>\n<p>Si, comme ce plugin, vous utilisez Webpack pour tout compiler y compris les styles et que vous importez le <code>.scss<\/code>fichier dans le <code>.js<\/code>fichier :<\/p>\n<pre><code>import '.\/main.scss';<\/code><\/pre>\n<p>vous devez utiliser <a href=\"https:\/\/github.com\/eliorivero\/wp-jest-tests\/blob\/master\/__mocks__\/styleMock.js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">styleMock.js<\/a> pour simuler les fichiers SASS lors de leur importation dans notre fichier JavaScript, sinon Jest se bloquera car il ne pourra pas r\u00e9soudre le module. Vous n&rsquo;avez pas besoin de beaucoup pour ce fichier, ajoutez simplement<\/p>\n<p>Jest utilisera cette maquette chaque fois qu&rsquo;il trouvera une <code>.scss<\/code>importation et les mappera sur la maquette, vous permettant d&rsquo;avancer avec des tests sans vous soucier des styles.<\/p>\n<h2>Configurer des globales pour Jest<\/h2>\n<p>Travaillons maintenant dans le fichier <a href=\"https:\/\/github.com\/eliorivero\/wp-jest-tests\/blob\/master\/__mocks__\/globals.js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">globals.js<\/a>. L&rsquo;un des avantages de l&rsquo;utilisation de Jest, c&rsquo;est qu&rsquo;il est d\u00e9j\u00e0 livr\u00e9 avec un d\u00e9j\u00e0 configur\u00e9 <code>jsdom<\/code>, une impl\u00e9mentation en pur JavaScript des standards Web, qui simule un environnement DOM comme si vous \u00e9tiez dans le navigateur, et nous l&rsquo;utiliserons pour simuler des \u00e9l\u00e9ments DOM pour nos essais.<\/p>\n<p>Cr\u00e9ez un dossier <code>__mocks__<\/code>et un <code>globals.js<\/code>fichier \u00e0 l&rsquo;int\u00e9rieur. Ajoutez ceci au fichier\u00a0:<\/p>\n<pre><code>import { JSDOM } from 'jsdom';\nconst dom = new JSDOM();\nglobal.document = dom.window.document;\nglobal.window = dom.window;\nglobal.window.wpJestTests = undefined;<\/code><\/pre>\n<p>Cela d\u00e9clarera et simulera certains objets et m\u00e9thodes que vous utiliserez plus tard dans vos tests. Le dernier est particuli\u00e8rement int\u00e9ressant<\/p>\n<pre><code>global.window.wpJestTests = undefined;<\/code><\/pre>\n<p>C&rsquo;est la variable globale que nous avons \u00e9crite en utilisant <code>wp_add_inline_script<\/code>. Vous devez le simuler en tant que variable globale pour pouvoir l&rsquo;utiliser dans vos tests.<\/p>\n<h2>Pr\u00e9sentation du fichier JavaScript<\/h2>\n<p>Le plugin WordPress a un seul fichier JavaScript <a href=\"https:\/\/github.com\/eliorivero\/wp-jest-tests\/blob\/master\/src\/main.js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">main.js<\/a> dans un <code>\/src<\/code>dossier. Ceci est ensuite transpil\u00e9 et sorti dans un <code>\/js\/front.js<\/code>fichier qui est ce que le PHP va charger. Le JavaScript charge cinq publications WordPress \u00e0 l&rsquo;aide <code>fetch<\/code>de, une fonction JavaScript standard, via l&rsquo;API WP REST et ins\u00e8re son titre, avec un lien vers la publication, dans un fichier <code>div.entry-content<\/code>.<\/p>\n<p>Vous allez exporter la fonction qui fait tout le travail\u00a0:<\/p>\n<pre><code>export const wpJestTestsInit =() =&gt; {<\/code><\/pre>\n<p>afin que vous puissiez l&rsquo;utiliser dans vos tests dans Jest.<\/p>\n<h2>\u00c9crire des tests unitaires JavaScript avec Jest, enfin !<\/h2>\n<p>Vous pouvez maintenant commencer \u00e0 \u00e9crire des tests\u00a0! Jest peut trouver des tests de plusieurs mani\u00e8res\u00a0:<\/p>\n<ul>\n<li>si le nom du fichier est<code>test.js<\/code><\/li>\n<li>ou est pr\u00e9c\u00e9d\u00e9 du nom du fichier qu&rsquo;il teste, comme<code>main.test.js<\/code><\/li>\n<li>s&rsquo;il s&rsquo;agit <code>.js<\/code>de fichiers situ\u00e9s dans un dossier nomm\u00e9<code>__tests__<\/code><\/li>\n<\/ul>\n<p>Cr\u00e9ez le <code>__tests__<\/code>dossier et \u00e0 l&rsquo;int\u00e9rieur, un fichier <code>front.test.js<\/code>. Vous pouvez voir <a href=\"https:\/\/github.com\/eliorivero\/wp-jest-tests\/blob\/master\/__tests__\/front.test.js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">le fichier JavaScript termin\u00e9 pour les tests Jest<\/a> dans le d\u00e9p\u00f4t compagnon. Parcourons-le en blocs. La premi\u00e8re ligne importe le fichier JS que nous voulons tester\u00a0:<\/p>\n<pre><code>import { wpJestTestsInit } from '..\/src\/main';<\/code><\/pre>\n<p>Ensuite, nous effa\u00e7ons tous les mocks, donc nous ne courons jamais avec des mocks sales portant des valeurs de tests pr\u00e9c\u00e9dents. Cela peut entra\u00eener des erreurs car, par exemple, si nous espionnons le nombre de fois qu&rsquo;une fonction simul\u00e9e a \u00e9t\u00e9 appel\u00e9e, nous pourrions obtenir une lecture incorrecte si nous n&rsquo;effa\u00e7ons pas la simulation entre test et test\u00a0:<\/p>\n<pre><code>afterEach(() =&gt; {\n    jest.clearAllMocks();\n} );<\/code><\/pre>\n<p>Le premier test que nous \u00e9crirons, fait des assertions de base lorsque certaines choses \u00e9chouent. Par exemple, si la variable globale <code>wpJestTests<\/code>avec laquelle nous \u00e9crivions <code>wp_add_inline_script<\/code>n&rsquo;a pas \u00e9t\u00e9 \u00e9crite pour une raison quelconque\u00a0:<\/p>\n<pre><code>describe( 'Initialization', () =&gt; {\n    test( 'if wpJestTests is undefined, nothing happens', () =&gt; {\n        expect( wpJestTestsInit() ).toBe( false );\n    } );\n\n    test( 'if .entry-content is missing, nothing happens', () =&gt; {\n        wpJestTests = { posts: 5 };\n        const mockQuerySelector = jest.spyOn( document, 'querySelector') .mockImplementation( () =&gt; undefined );\n        expect( wpJestTestsInit() ).toBe( false );\n        expect( mockQuerySelector ).toHaveBeenCalledTimes( 1 );\n    } );\n} );<\/code><\/pre>\n<p>Dans ce code,<\/p>\n<ul>\n<li><code>describe<\/code>cr\u00e9e un groupe compos\u00e9 de plusieurs tests li\u00e9s<\/li>\n<li><code>test<\/code>est ce qui effectue r\u00e9ellement un test<\/li>\n<li><code>expect<\/code>enveloppe notre sujet de test en donnant acc\u00e8s \u00e0 un certain nombre de &quot;matchers&quot; qui vous permettent de faire diff\u00e9rentes affirmations sur son contenu<\/li>\n<li><code>toBe<\/code>est l&rsquo;un de ces correspondants. Jest a beaucoup de <a href=\"https:\/\/jestjs.io\/docs\/en\/expect\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">matchers inclus<\/a>, et il y en a m\u00eame d&rsquo;autres que vous pouvez ajouter avec <a href=\"https:\/\/github.com\/jest-community\/jest-extended#jest-extended\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">un package tiers<\/a>.<\/li>\n<\/ul>\n<p>Le premier test ne d\u00e9finit rien pour <code>wpJestTests<\/code>donc sa valeur sera celle que vous avez d\u00e9finie dans <code>globals.js<\/code>. Comme il s&rsquo;agit de <code>undefined<\/code>, nous ne pouvons pas travailler, nous voulons donc confirmer que la fonction revient sans rien faire.<\/p>\n<p>Le deuxi\u00e8me test d\u00e9finit <code>wpJestTests<\/code>et se moque de la <code>document.querySelector<\/code>m\u00e9thode \u00e0 retourner <code>undefined<\/code>, qui est ce qu&rsquo;elle retournerait si elle ne trouvait pas d&rsquo;\u00e9l\u00e9ment dans le DOM. Dans ce cas, nous voulons confirmer que nous revenons sans rien faire et que notre fonction mocking <code>document.querySelector<\/code>a \u00e9t\u00e9 appel\u00e9e une fois.<\/p>\n<h2>R\u00e9cup\u00e9ration simul\u00e9e dans les tests Jest<\/h2>\n<p>La prochaine s\u00e9rie de tests commence par<\/p>\n<pre><code>describe( 'Fetch posts', () =&gt; {<\/code><\/pre>\n<p>et \u00e0 l&rsquo;int\u00e9rieur, nous avons une autre fonction de d\u00e9montage\u00a0:<\/p>\n<pre><code>afterAll( () =&gt; {\n    global.fetch.mockClear();\n    delete global.fetch;\n});<\/code><\/pre>\n<p>contrairement \u00e0 <code>afterEach<\/code>celui-ci, il s&rsquo;ex\u00e9cutera apr\u00e8s l&rsquo;ex\u00e9cution de tous les tests \u00e0 l&rsquo;int\u00e9rieur de ce <code>describe<\/code>bloc. \u00c9tant donn\u00e9 que notre fichier JavaScript utilise <code>fetch<\/code>pour charger les messages, nous devons v\u00e9rifier qu&rsquo;il a \u00e9t\u00e9 appel\u00e9 et qu&rsquo;il a renvoy\u00e9 ce que nous avons demand\u00e9, nous allons donc nous moquer de la <code>fetch<\/code>fonction\u00a0:<\/p>\n<pre><code>global.fetch = jest.fn().mockImplementation(\n    () =&gt; Promise.resolve({\n        ok: true,\n        status: 200,\n        json: () =&gt; Promise.resolve( [\n            {\n                link: 'test-1',\n                title: { rendered: 'Post 1' }\n            },\n            {\n                link: 'test-2',\n                title: { rendered: 'Post 2' }\n            },\n            {\n                link: 'test-3',\n                title: { rendered: 'Post 3' }\n            },\n            {\n                link: 'test-4',\n                title: { rendered: 'Post 4' }\n            },\n            {\n                link: 'test-5',\n                title: { rendered: 'Post 5' }\n            },\n        ] ),\n    })\n);<\/code><\/pre>\n<p>Nous nous moquons de la premi\u00e8re Promise qui se r\u00e9sout \u00e0 la r\u00e9ponse, et la seconde \u00e0 une repr\u00e9sentation JSON des donn\u00e9es. Ces donn\u00e9es sont similaires \u00e0 celles que nous obtenons de l&rsquo;API WP REST. \u00c9tant donn\u00e9 que notre code n&rsquo;a besoin que du titre et du lien, nous nous moquons de cela.<\/p>\n<h2>Test d&rsquo;int\u00e9gration JavaScript avec Jest dans un code asynchrone qui utilise fetch<\/h2>\n<p>Nous pouvons maintenant \u00e9crire le test en utilisant le mocked <code>fetch<\/code>. Il y a une diff\u00e9rence majeure avec ce test par rapport aux autres tests unitaires JavaScript: il s&rsquo;agit d&rsquo;un test d&rsquo;int\u00e9gration. Les tests pr\u00e9c\u00e9dents explor\u00e9s ici garantissaient simplement qu&rsquo;un composant fonctionnait bien. Nous avons v\u00e9rifi\u00e9 que si la variable globale d&rsquo;\u00e9tat initial n&rsquo;\u00e9tait pas d\u00e9finie, notre composant ne s&rsquo;afficherait pas. Ceci est diff\u00e9rent car nous allons tester le fonctionnement de l&rsquo;ensemble du syst\u00e8me lorsque la variable d&rsquo;\u00e9tat initiale est d\u00e9finie, d\u00e9clenchant ainsi une transaction de donn\u00e9es, et enfin ins\u00e9rer les titres des articles avec leurs liens dans le document.<\/p>\n<p>D\u00e8s le d\u00e9but, c&rsquo;est diff\u00e9rent: la fonction anonyme pass\u00e9e \u00e0 <code>test<\/code>re\u00e7oit un <code>done<\/code>param\u00e8tre. Il s&rsquo;agit en fait d&rsquo;une fonction qui sera appel\u00e9e \u00e0 la fin du test. Jest attendra <code>done<\/code>d&rsquo;\u00eatre appel\u00e9 avant de terminer le test. Si <code>done<\/code>n&rsquo;est jamais appel\u00e9, le test \u00e9chouera avec une erreur de temporisation. C&rsquo;est int\u00e9ressant pour nous puisque nous testons du code impliquant <code>fetch<\/code>, qui est une fonction asynchrone.<\/p>\n<pre><code>test( 'if posts are fetch, inserts them', done =&gt; {\n    wpJestTests = { posts: 5 };\n    const mockClassListAdd = jest.fn();\n    const divElem = {\n        tagName: 'DIV',\n        classList: { add: mockClassListAdd },\n        innerHTML: ''\n    };\n    const mockQuerySelector = jest.spyOn( document, 'querySelector') .mockImplementation( () =&gt; divElem );\n\n    expect( wpJestTestsInit() ).toBe( true );\n\n    process.nextTick(() =&gt; {\n        expect( mockQuerySelector ).toHaveBeenCalledTimes( 1 );\n        expect( global.fetch ).toHaveBeenCalledTimes( 1 );\n        expect( mockClassListAdd ).toHaveBeenCalledTimes( 1 );\n        expect( divElem.innerHTML.match( \/test-[1-5]\/g ).length ).toBe( 5 );\n\n        done();\n    });\n} );<\/code><\/pre>\n<p>Le global <code>wpJestTests<\/code>est d\u00e9fini et notre mocked <code>document.querySelector<\/code>renvoie maintenant ce qui ressemble \u00e0 un \u00e9l\u00e9ment HTML, avec even <code>classList<\/code>et sa <code>add<\/code>m\u00e9thode enfant.<\/p>\n<p>Nous appelons <code>wpJestTestsInit<\/code>et nous nous attendons \u00e0 ce qu&rsquo;il se termine correctement. Maintenant, puisqu&rsquo;il <code>fetch<\/code>est asynchrone, nous allons utiliser <code>process.nextTick<\/code>from <a href=\"https:\/\/nodejs.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Node.js<\/a>. Le <code>nextTick<\/code>in Node.js est la file d&rsquo;attente qui s&rsquo;ex\u00e9cutera apr\u00e8s la fin de tous les \u00e9v\u00e9nements de la boucle d&rsquo;\u00e9v\u00e9nements actuelle. C&rsquo;est formidable car toutes nos promesses seraient alors r\u00e9solues, ce qui est exactement ce dont nous avons besoin pour tester ce code qui implique <code>fetch<\/code>.<\/p>\n<p>Les autres sont plus des assertions pour s&rsquo;assurer <code>querySelector<\/code>que quelque chose a \u00e9t\u00e9 trouv\u00e9 avec lequel travailler, qui <code>fetch<\/code>a bien \u00e9t\u00e9 appel\u00e9, qu&rsquo;une classe a \u00e9t\u00e9 ajout\u00e9e \u00e0 la liste, et que les titres et les liens de nos articles ont \u00e9t\u00e9 ins\u00e9r\u00e9s dans l&rsquo;\u00e9l\u00e9ment HTML correspondant. Une fois que tout est fait, nous appelons <code>done<\/code>et notre test asynchrone se termine.<\/p>\n<h2>Ex\u00e9cutez vos tests Jest<\/h2>\n<p>Maintenant, vous pouvez taper<\/p>\n<p><code>npm run test<\/code><\/p>\n<p>et Jest ex\u00e9cutera les tests unitaires JavaScript pour votre plugin WordPress<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157897-61e6c3c169e87.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157897-61e6c3c169e87.png\" alt=\"Tests unitaires JavaScript faciles dans WordPress avec Jest\" ><\/a><\/p>\n<h2>Conclusion<\/h2>\n<p>So Jest est une solution g\u00e9niale et simple pour \u00e9crire des tests qui couvrent le code JavaScript de nos plugins ou th\u00e8mes WordPress. Mais il y a plus. Si nous \u00e9crivons une application React pour notre plugin, nous voudrons peut-\u00eatre faire des affirmations \u00e0 ce sujet. Jest peut aussi aider jusqu&rsquo;\u00e0 un certain point, et si nous avons besoin de plus, nous pouvons ajouter Enzyme \u00e0 nos outils et commencer \u00e0 \u00e9crire des tests d&rsquo;int\u00e9gration avec.<\/p>\n<p>Veuillez faire un don\u00a0!<\/p>\n<p>Si vous avez trouv\u00e9 cela utile, n&rsquo;h\u00e9sitez pas \u00e0 m&rsquo;acheter un caf\u00e9 <img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" alt=\"Tests unitaires JavaScript faciles dans WordPress avec Jest\" \/>pour que je puisse rester \u00e9veill\u00e9 et cr\u00e9er des tutoriels plus utiles pour vous\u00a0!<\/p>\n<p>3,00 $<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/startfunction.com\" class=\"external external_icon\">startfunction.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Assurez la stabilit\u00e9 du code JavaScript dans votre plugin WordPress en \u00e9crivant des tests unitaires JavaScript \u00e0 l&rsquo;aide de Jest.<\/p>\n","protected":false},"author":1,"featured_media":157898,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,728,748,1016,841,862],"tags":[1167],"class_list":["post-232145","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-javascript-3","category-open-source-projektmanagement-2","category-sites-utiles","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/232145","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=232145"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/232145\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/157898"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=232145"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=232145"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=232145"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}