{"id":231681,"date":"2023-01-10T16:01:00","date_gmt":"2023-01-10T13:01:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231681"},"modified":"2022-12-25T18:54:41","modified_gmt":"2022-12-25T15:54:41","slug":"enkla-javascript-enhetstester-i-wordpress-med-jest","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/enkla-javascript-enhetstester-i-wordpress-med-jest\/","title":{"rendered":"Enkla JavaScript-enhetstester i WordPress med Jest"},"content":{"rendered":"\n<p>WordPress har en l\u00e5ng erfarenhet av enhetsteste sin PHP-kod. Att skriva JavaScript-enhetstester och integrationstester f\u00f6r koden i teman och plugins har dock inte samma status. L\u00e5t oss se hur du testar JavaScript i v\u00e5ra WordPress-plugins och teman med Jest.<\/p>\n<p>Det h\u00e4r \u00e4r inneh\u00e5llet som vi kommer att t\u00e4cka i den h\u00e4r artikeln:<\/p>\n<h2>JavaScript-enhetstester i WordPress<\/h2>\n<p>S\u00e5 varf\u00f6r skriva enhetstester och integrationstester? De \u00e4r bra att se till att en funktion, klassmetod eller till och med en React-komponent g\u00f6r vad de ska g\u00f6ra. Det hj\u00e4lper till att uppt\u00e4cka fel i koden och hj\u00e4lper ocks\u00e5 till att bevara integriteten n\u00e4r \u00e4ndringar senare inf\u00f6rs i koden genom att verifiera att den fortfarande fungerar som avsett efter uppdateringen.<\/p>\n<p><a href=\"https:\/\/startfunction.com\/category\/wordpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress-<\/a> plugins och teman \u00e4r oftast skrivna i PHP och kan anv\u00e4nda PHPUnit-sviten f\u00f6r att k\u00f6ra tester, g\u00f6ra p\u00e5st\u00e5enden, h\u00e5na funktioner och mer. Handboken har till och med ett avsnitt som f\u00f6rklarar hur man snabbt <a href=\"https:\/\/make.wordpress.org\/cli\/handbook\/plugin-unit-tests\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">st\u00e4ller in enhetstestning med WP-CLI<\/a>.<\/p>\n<p>F\u00f6r JavaScript finns det en sida om <a href=\"https:\/\/make.wordpress.org\/core\/handbook\/testing\/automated-testing\/qunit\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">att k\u00f6ra QUnit-tester<\/a> i handboken, \u00e4ven om det handlar mer om att testa JavaScript-koden i WordPress-k\u00e4rnan.<\/p>\n<p>\u00c4ven om inget av detta \u00e4r standardiserat f\u00f6r JavaScript i WordPress, kan vi skriva fantastiska enhetstester med hj\u00e4lp av Jests testsvit. I den h\u00e4r artikeln l\u00e4r vi oss hur man skriver JavaScript-enhetstester f\u00f6r ett exempelplugin som laddar 5 inl\u00e4gg genom WP REST API med hj\u00e4lp av <code>fetch<\/code>funktionen fr\u00e5n JavaScript och renderar dem i ett visst DOM-element p\u00e5 sidan.<\/p>\n<h2>F\u00f6rdelar med att anv\u00e4nda Jest f\u00f6r JavaScript-enhetstester i WordPress<\/h2>\n<p>Tidigare innebar att skriva JavaScript-enhetstester att st\u00e4lla in Mocha f\u00f6r att k\u00f6ra tester, Chai f\u00f6r att g\u00f6ra p\u00e5st\u00e5enden och Sinon f\u00f6r att h\u00e5na funktioner och spionera p\u00e5 dem. \u00c4ven om de erbjuder stor flexibilitet \u00e4r det mycket mer komplicerat att arbeta med tre paket \u00e4n ett. <a href=\"https:\/\/jestjs.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Jest<\/a> tillhandah\u00e5ller allt detta i ett enda paket:<\/p>\n<ul>\n<li>du kan k\u00f6ra tester och deklarera dem med <code>describe<\/code>och <code>it<\/code>eller<code>test<\/code><\/li>\n<li>du kan g\u00f6ra p\u00e5st\u00e5enden med <code>expect<\/code>och <code>toBe<\/code>och <code>toHaveLength<\/code>m\u00e5nga fler<\/li>\n<li>du kan h\u00e5na funktioner och spionera p\u00e5 dem, och det finns flera s\u00e4tt att g\u00f6ra detta<\/li>\n<\/ul>\n<h3>Innan du g\u00e5r vidare<\/h3>\n<p>F\u00f6r att h\u00e5lla den h\u00e4r artikeln fokuserad p\u00e5 att testa med Jest, finns det ytterligare inst\u00e4llningar utanf\u00f6r testprocessen som Babel eller Webpack som inte kommer att t\u00e4ckas h\u00e4r. Allt detta kan hittas i <a href=\"https:\/\/github.com\/eliorivero\/wp-jest-tests\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP Jest Tests repo<\/a> som medf\u00f6ljer den h\u00e4r artikeln. F\u00f6r att h\u00e5lla saker kontextuella kommer varje avsnitt att l\u00e4nka till en av de relevanta filerna som vi kommer att skriva.<\/p>\n<h2>\u00d6versikt \u00f6ver PHP-sidan<\/h2>\n<p>PHP <a href=\"https:\/\/github.com\/eliorivero\/wp-jest-tests\/blob\/master\/wp-jest-tests.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00f6r exemplet plugin<\/a> som vi kommer att anv\u00e4nda f\u00f6r att l\u00e4ra oss hur man skriver JavaScript-enhetstesten \u00e4r ganska standard. De enda intressanta raderna \u00e4r de n\u00e4r vi st\u00e4ller v\u00e5r JavaScript-fil i k\u00f6 och l\u00e4gger till ett inline-skript f\u00f6r att skicka variabler till den:<\/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>Efter att ha s\u00f6kt v\u00e5r JavaScript-fil l\u00e4gger vi till en global variabel <code>wpJestTests<\/code>med <code>wp_add_inline_script()<\/code>. Den h\u00e4r variabeln \u00e4r s\u00e4rskilt intressant och sv\u00e5r att hantera eftersom den \u00e4r extern till v\u00e5r JavaScript-fil och vi m\u00e5ste h\u00e5na den i v\u00e5ra tester.<\/p>\n<h2>St\u00e4ll in Jest-tester<\/h2>\n<p>Vi m\u00e5ste f\u00f6rst initiera <code>npm<\/code>i v\u00e5rt plugin-projekt f\u00f6r att kunna installera Jest med det. Navigera i kommandoraden till din plugin-mapp och k\u00f6r:<\/p>\n<p><code>npm init<\/code>och g\u00e5 igenom serien med uppmaningar h\u00e4r<\/p>\n<p>Redigera filen <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> som skapades och l\u00e4gg till en ny post f\u00f6r att k\u00f6ra v\u00e5ra tester i <code>scripts<\/code>avsnittet:<\/p>\n<p><code>\"test\": \"jest\"<\/code><\/p>\n<p>Detta kommer att vara kommandot vi kommer att anv\u00e4nda f\u00f6r att ber\u00e4tta f\u00f6r Jest att k\u00f6ra v\u00e5ra JavaScript-enhetstester. Detta \u00e4r en eng\u00e5ngsk\u00f6rning, men Jest st\u00f6der ocks\u00e5 filvisning, s\u00e5 du kan ange ytterligare en:<\/p>\n<p><code>\"test-watch\": \"jest --watch\"<\/code><\/p>\n<p>Installera nu Jest som ett utvecklingsberoende genom att k\u00f6ra<\/p>\n<p><code>npm install -D jest<\/code><\/p>\n<p>Medan den installeras skapar du en fil med namnet <code>jest.config.js<\/code>. Detta kommer att h\u00e5lla all n\u00f6dv\u00e4ndig konfiguration. L\u00e4gg till f\u00f6ljande:<\/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>L\u00e5t oss g\u00e5 igenom var och en:<\/p>\n<ul>\n<li><code>verbose<\/code>: indikerar om varje enskilt test ska rapporteras under k\u00f6rningen. Alla fel kommer ocks\u00e5 fortfarande att visas l\u00e4ngst ner efter k\u00f6rning. Observera att om det bara finns en testfil som k\u00f6rs \u00e4r den som standard <code>true<\/code>.<\/li>\n<li><code>setupFiles<\/code>: en lista \u00f6ver s\u00f6kv\u00e4gar till moduler som k\u00f6r n\u00e5gon kod f\u00f6r att konfigurera eller st\u00e4lla in testmilj\u00f6n. Varje setupFile kommer att k\u00f6ras en g\u00e5ng per testfil. Eftersom varje test k\u00f6rs i sin egen milj\u00f6, kommer dessa skript att k\u00f6ras i testmilj\u00f6n omedelbart innan sj\u00e4lva testkoden k\u00f6rs. Vi kommer att anv\u00e4nda detta f\u00f6r att deklarera globala variabler renderade av PHP och WordPress med kommandon som <code>wp_add_inline_script<\/code>eller <code>wp_localize_script<\/code>.<\/li>\n<li><code>moduleNameMapper<\/code>: det h\u00e4r \u00e4r en karta fr\u00e5n regulj\u00e4ra uttryck till modulnamn (eller arrayer av modulnamn) som g\u00f6r att statiska resurser, som bilder eller stilar, kan f\u00f6rsvinna med en enda modul.<\/li>\n<\/ul>\n<p>Du har s\u00e4kert m\u00e4rkt referensen: detta \u00e4r en speciell token som ers\u00e4tts av Jest med roten till ditt projekt, vilket vanligtvis \u00e4r platsen f\u00f6r din <code>package.json<\/code>.<\/p>\n<p>Vi kommer att g\u00e5 p\u00e5 djupet i de kommande tv\u00e5 avsnitten men skapa f\u00f6rst mappen och dessa tv\u00e5 filer som refereras till ovan:<\/p>\n<ul>\n<li>skapa en mapp med namnet<code>__mocks__<\/code><\/li>\n<li>inuti mappen, skapa filerna <code>styleMock.js<\/code>och<code>globals.js<\/code><\/li>\n<\/ul>\n<h2>Mock stilar importeras f\u00f6r Jest-tester<\/h2>\n<p>Om du, som detta plugin, anv\u00e4nder Webpack f\u00f6r att kompilera allt inklusive stilar och du importerar <code>.scss<\/code>filen i <code>.js<\/code>filen:<\/p>\n<pre><code>import '.\/main.scss';<\/code><\/pre>\n<p>du m\u00e5ste anv\u00e4nda <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> f\u00f6r att h\u00e5na SASS-filer n\u00e4r du importerar dem i v\u00e5r JavaScript-fil, annars kommer Jest att krascha eftersom det inte kommer att kunna l\u00f6sa modulen. Du beh\u00f6ver inte mycket f\u00f6r den h\u00e4r filen, l\u00e4gg bara till<\/p>\n<p>Jest kommer att anv\u00e4nda denna mock varje g\u00e5ng den hittar en <code>.scss<\/code>import och kommer att mappa dem till mock, s\u00e5 att du kan g\u00e5 vidare med tester utan att bry dig om stilarna.<\/p>\n<h2>Konfigurera globaler f\u00f6r Jest<\/h2>\n<p>L\u00e5t oss arbeta nu i filen <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>. En av f\u00f6rdelarna med att anv\u00e4nda Jest \u00e4r att den redan levereras med en redan konfigurerad <code>jsdom<\/code>, en ren JavaScript-implementering av webbstandarder, som simulerar en DOM-milj\u00f6 som om du var i webbl\u00e4saren, och vi kommer att anv\u00e4nda den f\u00f6r att h\u00e5na DOM-element f\u00f6r v\u00e5ra tester.<\/p>\n<p>Skapa en mapp <code>__mocks__<\/code>och en <code>globals.js<\/code>fil i den. L\u00e4gg till detta i filen:<\/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>Detta kommer att f\u00f6rklara och h\u00e5na vissa objekt och metoder som du senare kommer att anv\u00e4nda i dina tester. Den sista \u00e4r av s\u00e4rskilt intresse<\/p>\n<pre><code>global.window.wpJestTests = undefined;<\/code><\/pre>\n<p>Det h\u00e4r \u00e4r den globala variabeln vi skrev med <code>wp_add_inline_script<\/code>. Du m\u00e5ste h\u00e5na den som en global variabel f\u00f6r att kunna anv\u00e4nda den i dina tester.<\/p>\n<h2>\u00d6versikt \u00f6ver JavaScript-filen<\/h2>\n<p>WordPress-pluginet har en enda JavaScript-fil <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> i en <code>\/src<\/code>mapp. Detta transpileras senare och matas ut i en <code>\/js\/front.js<\/code>fil som \u00e4r vad PHP kommer att ladda. JavaScript laddar fem WordPress-inl\u00e4gg med <code>fetch<\/code>, en standard JavaScript-funktion, genom WP REST API och infogar dess titel, med en l\u00e4nk till inl\u00e4gget, i en <code>div.entry-content<\/code>.<\/p>\n<p>Du kommer att exportera funktionen som g\u00f6r allt:<\/p>\n<pre><code>export const wpJestTestsInit =() =&gt; {<\/code><\/pre>\n<p>s\u00e5 att du kan anv\u00e4nda den i dina tester i Jest.<\/p>\n<h2>Skriver JavaScript-enhetstester med Jest, \u00e4ntligen!<\/h2>\n<p>Nu kan du b\u00f6rja skriva prov! Jest kan hitta tester p\u00e5 m\u00e5nga s\u00e4tt:<\/p>\n<ul>\n<li>om filnamnet \u00e4r<code>test.js<\/code><\/li>\n<li>eller har prefixet namnet p\u00e5 filen den testar, som<code>main.test.js<\/code><\/li>\n<li>om de \u00e4r <code>.js<\/code>filer som finns i en mapp med namnet<code>__tests__<\/code><\/li>\n<\/ul>\n<p>Skapa <code>__tests__<\/code>mappen och inuti den, en <code>front.test.js<\/code>. Du kan se <a href=\"https:\/\/github.com\/eliorivero\/wp-jest-tests\/blob\/master\/__tests__\/front.test.js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">den f\u00e4rdiga JavaScript-filen f\u00f6r Jest-testerna<\/a> i f\u00f6ljeslagaren. L\u00e5t oss g\u00e5 igenom det i block. Den f\u00f6rsta raden importerar JS-filen som vi vill testa:<\/p>\n<pre><code>import { wpJestTestsInit } from '..\/src\/main';<\/code><\/pre>\n<p>D\u00e4refter rensar vi alla h\u00e5nar, s\u00e5 vi k\u00f6r aldrig med smutsiga h\u00e5nar som b\u00e4r v\u00e4rden fr\u00e5n tidigare tester. Att g\u00f6ra detta kan leda till fel eftersom till exempel, om vi spionerar p\u00e5 hur m\u00e5nga g\u00e5nger en h\u00e5nad funktion anropades, kan vi f\u00e5 en felaktig l\u00e4sning om vi inte rensar h\u00e5net mellan test och test:<\/p>\n<pre><code>afterEach(() =&gt; {\n    jest.clearAllMocks();\n} );<\/code><\/pre>\n<p>Det f\u00f6rsta testet vi kommer att skriva, g\u00f6r grundl\u00e4ggande p\u00e5st\u00e5enden n\u00e4r vissa saker misslyckas. Till exempel, om den globala <code>wpJestTests<\/code>variabeln som vi skrev med <code>wp_add_inline_script<\/code>inte skrevs av n\u00e5gon anledning:<\/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>I den h\u00e4r koden,<\/p>\n<ul>\n<li><code>describe<\/code>skapar en grupp som best\u00e5r av flera relaterade tester<\/li>\n<li><code>test<\/code>\u00e4r det som faktiskt utf\u00f6r ett test<\/li>\n<li><code>expect<\/code>omsluter v\u00e5rt test\u00e4mne och ger tillg\u00e5ng till ett antal &quot;matchare&quot; som l\u00e5ter dig g\u00f6ra olika p\u00e5st\u00e5enden om dess inneh\u00e5ll<\/li>\n<li><code>toBe<\/code>\u00e4r en av dessa matchare. Jest har m\u00e5nga <a href=\"https:\/\/jestjs.io\/docs\/en\/expect\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">matchare inkluderade<\/a>, och det finns \u00e4ven andra som du kan l\u00e4gga till med <a href=\"https:\/\/github.com\/jest-community\/jest-extended#jest-extended\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ett tredjepartspaket<\/a>.<\/li>\n<\/ul>\n<p>Det f\u00f6rsta testet definierar inget f\u00f6r <code>wpJestTests<\/code>s\u00e5 dess v\u00e4rde kommer att vara det du definierade i <code>globals.js<\/code>. Eftersom det \u00e4r <code>undefined<\/code>, kan vi inte arbeta s\u00e5 vi vill bekr\u00e4fta att funktionen returnerar utan att g\u00f6ra n\u00e5got.<\/p>\n<p>Det andra testet definierar <code>wpJestTests<\/code>och h\u00e5nar <code>document.querySelector<\/code>metoden att returnera <code>undefined<\/code>vilket \u00e4r vad det skulle returnera om det inte kunde hitta ett element i DOM. I s\u00e5dana fall vill vi bekr\u00e4fta att vi \u00e5terv\u00e4nder utan att g\u00f6ra n\u00e5got, och att v\u00e5r funktion mocking <code>document.querySelector<\/code>anropades en g\u00e5ng.<\/p>\n<h2>Mock apport i Jest-tester<\/h2>\n<p>N\u00e4sta upps\u00e4ttning tester b\u00f6rjar med<\/p>\n<pre><code>describe( 'Fetch posts', () =&gt; {<\/code><\/pre>\n<p>och inuti detta har vi en annan rivningsfunktion:<\/p>\n<pre><code>afterAll( () =&gt; {\n    global.fetch.mockClear();\n    delete global.fetch;\n});<\/code><\/pre>\n<p>unlike <code>afterEach<\/code>this kommer att k\u00f6ras efter att alla tester i detta <code>describe<\/code>block har k\u00f6rts. Eftersom v\u00e5r JavaScript-fil anv\u00e4nder <code>fetch<\/code>f\u00f6r att ladda inl\u00e4ggen m\u00e5ste vi verifiera att den anropades och att den returnerade det vi beg\u00e4rde, s\u00e5 vi kommer att h\u00e5na <code>fetch<\/code>funktionen:<\/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>Vi h\u00e5nar det f\u00f6rsta l\u00f6ftet som l\u00f6ser svaret och det andra till en JSON-representation av data. Dessa data liknar vad vi f\u00e5r fr\u00e5n WP REST API. Med tanke p\u00e5 att v\u00e5r kod bara beh\u00f6ver titeln och l\u00e4nken, h\u00e5nar vi det.<\/p>\n<h2>JavaScript-integreringstest med Jest i asynkron kod som anv\u00e4nder h\u00e4mta<\/h2>\n<p>Vi kan nu skriva testet med den mocked <code>fetch<\/code>. Det finns en stor skillnad med detta test j\u00e4mf\u00f6rt med de andra JavaScript-enhetstesten: det h\u00e4r \u00e4r ett integrationstest. Tidigare tester som utforskats h\u00e4r s\u00e4kerst\u00e4llde helt enkelt att en komponent fungerade bra. Vi kontrollerade att om den globala initialvariabeln inte var definierad, skulle v\u00e5r komponent inte \u00e5terges. Detta \u00e4r annorlunda eftersom vi kommer att testa hur hela systemet fungerar n\u00e4r den initiala tillst\u00e5ndsvariabeln \u00e4r definierad, vilket utl\u00f6ser en datatransaktion och slutligen infogar inl\u00e4ggets rubriker med deras l\u00e4nkar i dokumentet.<\/p>\n<p>Redan fr\u00e5n b\u00f6rjan \u00e4r detta annorlunda: den anonyma funktionen som skickas till <code>test<\/code>tar emot en <code>done<\/code>parameter. Detta \u00e4r faktiskt en funktion som kommer att anropas n\u00e4r vi avslutar testet. Jest kommer att v\u00e4nta tills <code>done<\/code>det anropas innan testet avslutas. Om <code>done<\/code>aldrig anropas kommer testet att misslyckas med ett timeout-fel. Det \u00e4r intressant f\u00f6r oss eftersom vi testar kod som involverar <code>fetch<\/code>, som \u00e4r en asynkron funktion.<\/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>Det globala <code>wpJestTests<\/code>\u00e4r definierat och v\u00e5r mocked <code>document.querySelector<\/code>returnerar nu vad som liknar ett HTML-element, med j\u00e4mn <code>classList<\/code>och dess <code>add<\/code>underordnade metod.<\/p>\n<p>Vi ringer <code>wpJestTestsInit<\/code>och f\u00f6rv\u00e4ntar oss att det slutar p\u00e5 r\u00e4tt s\u00e4tt. Nu, eftersom <code>fetch<\/code>det \u00e4r asynkront, kommer vi att anv\u00e4nda <code>process.nextTick<\/code>fr\u00e5n <a href=\"https:\/\/nodejs.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Node.js<\/a>. I <code>nextTick<\/code>Node.js \u00e4r k\u00f6n som kommer att k\u00f6ras efter att alla h\u00e4ndelser i den aktuella h\u00e4ndelseslingan har avslutats. Detta \u00e4r bra eftersom alla v\u00e5ra l\u00f6ften skulle vara l\u00f6sta d\u00e5, vilket \u00e4r precis vad vi beh\u00f6ver f\u00f6r att testa den h\u00e4r koden som involverar <code>fetch<\/code>.<\/p>\n<p>Resten \u00e4r fler p\u00e5st\u00e5enden f\u00f6r att s\u00e4kerst\u00e4lla att vi <code>querySelector<\/code>hittat n\u00e5got att arbeta med, som <code>fetch<\/code>verkligen hette, att en klass lades till i listan och att rubrikerna och l\u00e4nkarna till v\u00e5ra inl\u00e4gg infogades i motsvarande HTML-element. N\u00e4r allt \u00e4r klart ringer vi <code>done<\/code>och v\u00e5rt asynkrona test slutar.<\/p>\n<h2>K\u00f6r dina Jest-tester<\/h2>\n<p>Nu kan du skriva<\/p>\n<p><code>npm run test<\/code><\/p>\n<p>och Jest kommer att k\u00f6ra JavaScript-enhetstesten f\u00f6r ditt WordPress-plugin<\/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=\"Enkla JavaScript-enhetstester i WordPress med Jest\" ><\/a><\/p>\n<h2>Slutsats<\/h2>\n<p>S\u00e5 Jest \u00e4r en bra och enkel l\u00f6sning f\u00f6r att skriva tester som t\u00e4cker JavaScript-koden f\u00f6r v\u00e5ra WordPress-plugins eller teman. Men det finns mer. Om vi \u200b\u200bskriver en React-app f\u00f6r v\u00e5rt plugin kanske vi vill g\u00f6ra p\u00e5st\u00e5enden om det. Jest kan hj\u00e4lpa upp till en viss del ocks\u00e5, och om vi beh\u00f6ver mer kan vi l\u00e4gga till Enzyme i v\u00e5ra verktyg och b\u00f6rja skriva integrationstester med det.<\/p>\n<p>V\u00e4nligen donera!<\/p>\n<p>Om du tyckte att det h\u00e4r var anv\u00e4ndbart, k\u00f6p g\u00e4rna en kaffe till mig <img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" alt=\"Enkla JavaScript-enhetstester i WordPress med Jest\" \/>s\u00e5 att jag kan h\u00e5lla mig vaken och skapa fler anv\u00e4ndbara tutorials f\u00f6r dig!<\/p>\n<p>3,00 USD<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/startfunction.com\" class=\"external external_icon\">startfunction.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>S\u00e4kerst\u00e4ll stabiliteten f\u00f6r JavaScript-koden i ditt WordPress-plugin genom att skriva JavaScript-enhetstester med 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":[1022,848,734,901,755,724,868],"tags":[1173],"class_list":["post-231681","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-anvandbara-webbplatser","category-handledningar","category-javascript-9","category-koda","category-oeppen-kaella","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/231681","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=231681"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/231681\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/157898"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=231681"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=231681"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=231681"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}