{"id":232240,"date":"2023-01-10T15:56:00","date_gmt":"2023-01-10T12:56:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232240"},"modified":"2022-11-10T08:15:17","modified_gmt":"2022-11-10T05:15:17","slug":"testes-de-unidade-javascript-faceis-no-wordpress-com-jest","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/testes-de-unidade-javascript-faceis-no-wordpress-com-jest\/","title":{"rendered":"Testes de unidade JavaScript f\u00e1ceis no WordPress com Jest"},"content":{"rendered":"\n<p>O WordPress tem um longo hist\u00f3rico de testes unit\u00e1rios de seu c\u00f3digo PHP. No entanto, escrever testes de unidade JavaScript e testes de integra\u00e7\u00e3o para o c\u00f3digo em temas e plugins n\u00e3o tem o mesmo status. Vamos ver como testar o JavaScript em nossos plugins e temas do WordPress usando Jest.<\/p>\n<p>Estes s\u00e3o os conte\u00fados que abordaremos neste artigo:<\/p>\n<h2>Testes Unit\u00e1rios JavaScript no WordPress<\/h2>\n<p>Ent\u00e3o, por que escrever testes de unidade e testes de integra\u00e7\u00e3o? Eles s\u00e3o \u00f3timos para garantir que uma fun\u00e7\u00e3o, m\u00e9todo de classe ou at\u00e9 mesmo um componente React fa\u00e7a o que deveria fazer. Ele ajuda a detectar erros no c\u00f3digo e tamb\u00e9m ajuda a preservar a integridade quando as altera\u00e7\u00f5es s\u00e3o introduzidas posteriormente no c\u00f3digo, verificando se ainda est\u00e1 funcionando conforme o esperado ap\u00f3s a atualiza\u00e7\u00e3o.<\/p>\n<p><a href=\"https:\/\/startfunction.com\/category\/wordpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Os plugins e temas do WordPress<\/a> s\u00e3o escritos principalmente em PHP e podem usar a su\u00edte PHPUnit para executar testes, fazer declara\u00e7\u00f5es, simular fun\u00e7\u00f5es e muito mais. <a href=\"https:\/\/make.wordpress.org\/cli\/handbook\/plugin-unit-tests\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">O manual ainda tem uma se\u00e7\u00e3o explicando como configurar<\/a> rapidamente o teste de unidade com o WP-CLI .<\/p>\n<p>Para JavaScript, h\u00e1 uma p\u00e1gina sobre <a href=\"https:\/\/make.wordpress.org\/core\/handbook\/testing\/automated-testing\/qunit\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a execu\u00e7\u00e3o de testes QUnit<\/a> no Handbook, embora seja mais sobre testar o c\u00f3digo JavaScript no n\u00facleo do WordPress.<\/p>\n<p>Embora nada disso seja padronizado para JavaScript no WordPress, podemos escrever \u00f3timos testes de unidade usando o conjunto de testes Jest. Neste artigo vamos aprender como escrever testes de unidade JavaScript para um plugin de exemplo que carrega 5 posts atrav\u00e9s da WP REST API usando a <code>fetch<\/code>fun\u00e7\u00e3o do JavaScript e os renderiza em um determinado elemento DOM na p\u00e1gina.<\/p>\n<h2>Benef\u00edcios de usar Jest para testes de unidade JavaScript no WordPress<\/h2>\n<p>No passado, escrever testes de unidade JavaScript envolvia configurar Mocha para executar testes, Chai para fazer asser\u00e7\u00f5es e Sinon para simular fun\u00e7\u00f5es e espion\u00e1-las. Embora ofere\u00e7am grande flexibilidade, \u00e9 muito mais complexo trabalhar com tr\u00eas pacotes do que com um. <a href=\"https:\/\/jestjs.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">O Jest<\/a> fornece tudo isso em um \u00fanico pacote:<\/p>\n<ul>\n<li>voc\u00ea pode executar testes declarando-os com <code>describe<\/code>e <code>it<\/code>ou<code>test<\/code><\/li>\n<li>voc\u00ea pode fazer afirma\u00e7\u00f5es com <code>expect<\/code>e <code>toBe<\/code>, <code>toHaveLength<\/code>e muito mais<\/li>\n<li>voc\u00ea pode simular fun\u00e7\u00f5es e espion\u00e1-las, e existem v\u00e1rias maneiras de fazer isso<\/li>\n<\/ul>\n<h3>Antes de seguir em frente<\/h3>\n<p>Para manter este artigo focado em testes com Jest, h\u00e1 uma configura\u00e7\u00e3o adicional externa ao processo de teste como Babel ou Webpack que n\u00e3o ser\u00e1 abordada aqui. Tudo isso pode ser encontrado no <a href=\"https:\/\/github.com\/eliorivero\/wp-jest-tests\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">reposit\u00f3rio WP Jest Tests<\/a> que acompanha este artigo. Para manter as coisas contextuais, cada se\u00e7\u00e3o ser\u00e1 vinculada a um dos arquivos relevantes que escreveremos.<\/p>\n<h2>Vis\u00e3o geral do lado do PHP<\/h2>\n<p>O <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 para o plugin de exemplo<\/a> que usaremos para aprender a escrever os testes de unidade JavaScript \u00e9 bastante padr\u00e3o. As \u00fanicas linhas interessantes s\u00e3o aquelas quando enfileiramos nosso arquivo JavaScript e adicionamos um script embutido para passar vari\u00e1veis \u200b\u200bpara ele:<\/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>Depois de enfileirar nosso arquivo JavaScript, adicionamos uma vari\u00e1vel global <code>wpJestTests<\/code>com <code>wp_add_inline_script()<\/code>. Essa vari\u00e1vel \u00e9 particularmente interessante e complicada de lidar porque \u00e9 externa ao nosso arquivo JavaScript e teremos que zombar dela em nossos testes.<\/p>\n<h2>Configurar testes do Jest<\/h2>\n<p>Primeiro teremos que inicializar <code>npm<\/code>em nosso projeto de plugin para poder instalar o Jest com ele. Navegue na linha de comando at\u00e9 a pasta do seu plugin e execute:<\/p>\n<p><code>npm init<\/code>e percorra a s\u00e9rie de prompts aqui<\/p>\n<p>Edite o arquivo <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> que foi criado e adicione uma nova entrada para executar nossos testes na <code>scripts<\/code>se\u00e7\u00e3o:<\/p>\n<p><code>\"test\": \"jest\"<\/code><\/p>\n<p>Este ser\u00e1 o comando que usaremos para dizer ao Jest para executar nossos testes de unidade JavaScript. Esta \u00e9 uma execu\u00e7\u00e3o \u00fanica, mas o Jest tamb\u00e9m suporta a visualiza\u00e7\u00e3o de arquivos, para que voc\u00ea possa inserir uma adicional:<\/p>\n<p><code>\"test-watch\": \"jest --watch\"<\/code><\/p>\n<p>Agora instale o Jest como uma depend\u00eancia de desenvolvimento executando<\/p>\n<p><code>npm install -D jest<\/code><\/p>\n<p>Durante a instala\u00e7\u00e3o, crie um arquivo chamado <code>jest.config.js<\/code>. Isso manter\u00e1 toda a configura\u00e7\u00e3o necess\u00e1ria. Adicione o seguinte:<\/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>Vamos passar por cada um:<\/p>\n<ul>\n<li><code>verbose<\/code>: indica se cada teste individual deve ser relatado durante a execu\u00e7\u00e3o. Todos os erros tamb\u00e9m ser\u00e3o mostrados na parte inferior ap\u00f3s a execu\u00e7\u00e3o. Observe que, se houver apenas um arquivo de teste sendo executado, o padr\u00e3o ser\u00e1 <code>true<\/code>.<\/li>\n<li><code>setupFiles<\/code>: uma lista de caminhos para m\u00f3dulos que executam algum c\u00f3digo para configurar ou configurar o ambiente de teste. Cada setupFile ser\u00e1 executado uma vez por arquivo de teste. Como cada teste \u00e9 executado em seu pr\u00f3prio ambiente, esses scripts ser\u00e3o executados no ambiente de teste imediatamente antes de executar o pr\u00f3prio c\u00f3digo de teste. Usaremos isso para declarar vari\u00e1veis \u200b\u200bglobais renderizadas por PHP e WordPress com comandos como <code>wp_add_inline_script<\/code>ou <code>wp_localize_script<\/code>.<\/li>\n<li><code>moduleNameMapper<\/code>: este \u00e9 um mapa de express\u00f5es regulares para nomes de m\u00f3dulos (ou arrays de nomes de m\u00f3dulos) que permitem stub out recursos est\u00e1ticos, como imagens ou estilos com um \u00fanico m\u00f3dulo.<\/li>\n<\/ul>\n<p>Voc\u00ea certamente notou a refer\u00eancia: este \u00e9 um token especial que \u00e9 substitu\u00eddo pelo Jest com a raiz do seu projeto, que geralmente \u00e9 a localiza\u00e7\u00e3o do seu arquivo <code>package.json<\/code>.<\/p>\n<p>Vamos nos aprofundar nas pr\u00f3ximas duas se\u00e7\u00f5es, mas primeiro, crie a pasta e esses dois arquivos mencionados acima:<\/p>\n<ul>\n<li>crie uma pasta com o nome<code>__mocks__<\/code><\/li>\n<li>dentro da pasta, crie os arquivos <code>styleMock.js<\/code>e<code>globals.js<\/code><\/li>\n<\/ul>\n<h2>Importa\u00e7\u00e3o de estilos simulados para testes Jest<\/h2>\n<p>Se, como este plugin, voc\u00ea usa o Webpack para compilar tudo, incluindo estilos, e est\u00e1 importando o <code>.scss<\/code>arquivo no <code>.js<\/code>arquivo:<\/p>\n<pre><code>import '.\/main.scss';<\/code><\/pre>\n<p>voc\u00ea precisa usar <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> para simular arquivos SASS ao import\u00e1-los em nosso arquivo JavaScript, caso contr\u00e1rio, o Jest travar\u00e1, pois n\u00e3o poder\u00e1 resolver o m\u00f3dulo. Voc\u00ea n\u00e3o precisa de muito para este arquivo, basta adicionar<\/p>\n<p>O Jest usar\u00e1 esse mock toda vez que encontrar uma <code>.scss<\/code>importa\u00e7\u00e3o e os mapear\u00e1 para o mock, permitindo que voc\u00ea avance com os testes sem se preocupar com os estilos.<\/p>\n<h2>Configurar globais para Jest<\/h2>\n<p>Vamos trabalhar agora no arquivo <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>. Uma das vantagens de usar o Jest, \u00e9 que ele j\u00e1 vem com um j\u00e1 configurado <code>jsdom<\/code>, uma implementa\u00e7\u00e3o de padr\u00f5es web puro-JavaScript, que simula um ambiente DOM como se voc\u00ea estivesse no navegador, e vamos us\u00e1-lo para simular elementos DOM para nossos testes.<\/p>\n<p>Crie uma pasta <code>__mocks__<\/code>e um <code>globals.js<\/code>arquivo dentro dela. Adicione isso ao arquivo:<\/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>Isso declarar\u00e1 e zombar\u00e1 de alguns objetos e m\u00e9todos que voc\u00ea usar\u00e1 posteriormente em seus testes. O \u00faltimo \u00e9 de particular interesse<\/p>\n<pre><code>global.window.wpJestTests = undefined;<\/code><\/pre>\n<p>Esta \u00e9 a vari\u00e1vel global que escrevemos usando <code>wp_add_inline_script<\/code>. Voc\u00ea precisa zombar dela como uma vari\u00e1vel global para poder us\u00e1-la em seus testes.<\/p>\n<h2>Vis\u00e3o geral do arquivo JavaScript<\/h2>\n<p>O plugin do WordPress tem um \u00fanico arquivo 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> em uma <code>\/src<\/code>pasta. Isso \u00e9 posteriormente transpilado e gerado em um <code>\/js\/front.js<\/code>arquivo que \u00e9 o que o PHP carregar\u00e1. O JavaScript carrega cinco posts do WordPress usando <code>fetch<\/code>, uma fun\u00e7\u00e3o JavaScript padr\u00e3o, por meio da API WP REST e insere seu t\u00edtulo, com um link para o post, em um arquivo <code>div.entry-content<\/code>.<\/p>\n<p>Voc\u00ea vai exportar a fun\u00e7\u00e3o que faz todo o trabalho:<\/p>\n<pre><code>export const wpJestTestsInit =() =&gt; {<\/code><\/pre>\n<p>para que voc\u00ea possa us\u00e1-lo em seus testes no Jest.<\/p>\n<h2>Escrevendo testes de unidade JavaScript com Jest, finalmente!<\/h2>\n<p>Agora voc\u00ea pode come\u00e7ar a escrever testes! Jest pode encontrar testes de v\u00e1rias maneiras:<\/p>\n<ul>\n<li>se o nome do arquivo for<code>test.js<\/code><\/li>\n<li>ou \u00e9 prefixado com o nome do arquivo que testa, como<code>main.test.js<\/code><\/li>\n<li>se forem <code>.js<\/code>arquivos localizados em uma pasta chamada<code>__tests__<\/code><\/li>\n<\/ul>\n<p>Crie a <code>__tests__<\/code>pasta e dentro dela, um arquivo <code>front.test.js<\/code>. Voc\u00ea pode ver <a href=\"https:\/\/github.com\/eliorivero\/wp-jest-tests\/blob\/master\/__tests__\/front.test.js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o arquivo JavaScript finalizado para os testes Jest no reposit\u00f3rio<\/a> complementar. Vamos passar por isso em blocos. A primeira linha importa o arquivo JS que queremos testar:<\/p>\n<pre><code>import { wpJestTestsInit } from '..\/src\/main';<\/code><\/pre>\n<p>Em seguida, limpamos todos os mocks, para que nunca executemos mocks sujos carregando valores de testes anteriores. Fazer isso pode levar a erros, pois, por exemplo, se estivermos espionando quantas vezes uma fun\u00e7\u00e3o simulada foi chamada, podemos obter uma leitura incorreta se n\u00e3o limparmos a simula\u00e7\u00e3o entre teste e teste:<\/p>\n<pre><code>afterEach(() =&gt; {\n    jest.clearAllMocks();\n} );<\/code><\/pre>\n<p>O primeiro teste que escreveremos faz afirma\u00e7\u00f5es b\u00e1sicas quando algumas coisas falham. Por exemplo, se a vari\u00e1vel global <code>wpJestTests<\/code>com a qual est\u00e1vamos escrevendo <code>wp_add_inline_script<\/code>n\u00e3o foi escrita por qualquer motivo:<\/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>Neste c\u00f3digo,<\/p>\n<ul>\n<li><code>describe<\/code>cria um grupo composto por v\u00e1rios testes relacionados<\/li>\n<li><code>test<\/code>\u00e9 o que realmente realiza um teste<\/li>\n<li><code>expect<\/code>envolve nosso assunto de teste fornecendo acesso a v\u00e1rios &#8220;matchers&quot; que permitem fazer diferentes afirma\u00e7\u00f5es sobre seu conte\u00fado<\/li>\n<li><code>toBe<\/code>\u00e9 um desses matchers. O Jest tem muitos <a href=\"https:\/\/jestjs.io\/docs\/en\/expect\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">matchers inclu\u00eddos<\/a> e h\u00e1 ainda outros que voc\u00ea pode adicionar com <a href=\"https:\/\/github.com\/jest-community\/jest-extended#jest-extended\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">um pacote de terceiros<\/a>.<\/li>\n<\/ul>\n<p>O primeiro teste n\u00e3o est\u00e1 definindo nada para <code>wpJestTests<\/code>, portanto, seu valor ser\u00e1 o que voc\u00ea definiu em <code>globals.js<\/code>. Como \u00e9 <code>undefined<\/code>, n\u00e3o podemos trabalhar, ent\u00e3o queremos confirmar que a fun\u00e7\u00e3o retorna sem fazer nada.<\/p>\n<p>O segundo teste define <code>wpJestTests<\/code>e simula o <code>document.querySelector<\/code>m\u00e9todo para retornar <code>undefined<\/code>que \u00e9 o que ele retornaria se n\u00e3o pudesse encontrar um elemento no DOM. Nesse caso, queremos confirmar que estamos retornando sem fazer nada e que nossa fun\u00e7\u00e3o mocking <code>document.querySelector<\/code>foi chamada uma vez.<\/p>\n<h2>Busca simulada em testes Jest<\/h2>\n<p>O pr\u00f3ximo conjunto de testes come\u00e7a com<\/p>\n<pre><code>describe( 'Fetch posts', () =&gt; {<\/code><\/pre>\n<p>e dentro disso, temos outra fun\u00e7\u00e3o tear down:<\/p>\n<pre><code>afterAll( () =&gt; {\n    global.fetch.mockClear();\n    delete global.fetch;\n});<\/code><\/pre>\n<p>ao contr\u00e1rio <code>afterEach<\/code>disso, ser\u00e1 executado depois que todos os testes dentro deste <code>describe<\/code>bloco forem executados. Como nosso arquivo JavaScript usa <code>fetch<\/code>para carregar os posts, precisamos verificar se ele foi chamado e retornou o que solicitamos, ent\u00e3o vamos zombar da <code>fetch<\/code>fun\u00e7\u00e3o:<\/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>N\u00f3s zombamos da primeira Promise que resolve para a resposta e a segunda para uma representa\u00e7\u00e3o JSON dos dados. Esses dados s\u00e3o semelhantes aos que obtemos da API REST do WP. Dado que nosso c\u00f3digo precisa apenas do t\u00edtulo e do link, estamos zombando disso.<\/p>\n<h2>Teste de integra\u00e7\u00e3o JavaScript com Jest em c\u00f3digo ass\u00edncrono que usa fetch<\/h2>\n<p>Agora podemos escrever o teste usando o mocked <code>fetch<\/code>. H\u00e1 uma grande diferen\u00e7a com este teste em compara\u00e7\u00e3o com os outros testes de unidade JavaScript: este \u00e9 um teste de integra\u00e7\u00e3o. Testes anteriores explorados aqui simplesmente garantiram que um componente estava funcionando bem. Verificamos que se a vari\u00e1vel global de estado inicial n\u00e3o estivesse definida, nosso componente n\u00e3o renderia. Isso \u00e9 diferente porque vamos testar como todo o sistema funciona quando a vari\u00e1vel de estado inicial \u00e9 definida, acionando assim uma transa\u00e7\u00e3o de dados e, finalmente, inserindo os t\u00edtulos dos posts com seus links no documento.<\/p>\n<p>Desde o in\u00edcio, isso \u00e9 diferente: a fun\u00e7\u00e3o an\u00f4nima passada para <code>test<\/code>recebe um <code>done<\/code>par\u00e2metro. Esta \u00e9, na verdade, uma fun\u00e7\u00e3o que ser\u00e1 chamada quando terminarmos o teste. Jest vai esperar at\u00e9 <code>done<\/code>ser chamado antes de terminar o teste. Se <code>done<\/code>nunca for chamado, o teste falhar\u00e1 com um erro de tempo limite. Isso \u00e9 interessante para n\u00f3s, pois estamos testando c\u00f3digo envolvendo <code>fetch<\/code>, que \u00e9 uma fun\u00e7\u00e3o ass\u00edncrona.<\/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>O global <code>wpJestTests<\/code>est\u00e1 definido e nosso mocked <code>document.querySelector<\/code>agora retorna o que se assemelha a um elemento HTML, com even <code>classList<\/code>e seu <code>add<\/code>m\u00e9todo filho.<\/p>\n<p>Chamamos <code>wpJestTestsInit<\/code>e esperamos que termine corretamente. Agora, como <code>fetch<\/code>\u00e9 ass\u00edncrono, vamos fazer uso <code>process.nextTick<\/code>do <a href=\"https:\/\/nodejs.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Node.js<\/a>. O <code>nextTick<\/code>no Node.js \u00e9 a fila que ser\u00e1 executada ap\u00f3s a conclus\u00e3o de todos os eventos no loop de eventos atual. Isso \u00e9 \u00f3timo porque todas as nossas promessas seriam resolvidas ent\u00e3o, que \u00e9 exatamente o que precisamos para testar esse c\u00f3digo que envolve <code>fetch<\/code>.<\/p>\n<p>O resto s\u00e3o mais asser\u00e7\u00f5es para garantir que <code>querySelector<\/code>encontrou algo com que trabalhar, que de <code>fetch<\/code>fato foi chamado, que uma classe foi adicionada \u00e0 lista, e que os t\u00edtulos e links de nossos posts foram inseridos no elemento HTML correspondente. Quando tudo estiver pronto, chamamos <code>done<\/code>e nosso teste ass\u00edncrono termina.<\/p>\n<h2>Execute seus testes Jest<\/h2>\n<p>Agora voc\u00ea pode digitar<\/p>\n<p><code>npm run test<\/code><\/p>\n<p>e o Jest executar\u00e1 os testes de unidade JavaScript para o seu 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=\"Testes de unidade JavaScript f\u00e1ceis no WordPress com Jest\" ><\/a><\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>Ent\u00e3o Jest \u00e9 uma solu\u00e7\u00e3o \u00f3tima e simples para escrever testes que cobrem o c\u00f3digo JavaScript de nossos plugins ou temas do WordPress. Mas h\u00e1 mais. Se estivermos escrevendo um aplicativo React para nosso plugin, podemos querer fazer afirma\u00e7\u00f5es sobre ele. O Jest tamb\u00e9m pode ajudar at\u00e9 certo ponto e, se precisarmos de mais, podemos adicionar Enzyme \u00e0s nossas ferramentas e come\u00e7ar a escrever testes de integra\u00e7\u00e3o com ele.<\/p>\n<p>Por favor doe!<\/p>\n<p>Se voc\u00ea achou isso \u00fatil, sinta-se \u00e0 vontade para me pagar um caf\u00e9 <img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" alt=\"Testes de unidade JavaScript f\u00e1ceis no WordPress com Jest\" \/>para que eu possa ficar acordado e criar tutoriais mais \u00fateis para voc\u00ea!<\/p>\n<p>$ 3,00<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/startfunction.com\" class=\"external external_icon\">startfunction.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Garanta a estabilidade do c\u00f3digo JavaScript em seu plugin WordPress escrevendo testes de unidade JavaScript usando 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":[898,753,722,733,1021,846,867],"tags":[1170],"class_list":["post-232240","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-codigo-aberto","category-desenvolvedor","category-javascript-8","category-sites-uteis","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/232240","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=232240"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/232240\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/157898"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=232240"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=232240"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=232240"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}