{"id":232236,"date":"2023-01-10T15:42:00","date_gmt":"2023-01-10T12:42:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232236"},"modified":"2022-11-10T08:13:54","modified_gmt":"2022-11-10T05:13:54","slug":"helpot-javascript-yksikkoetestit-wordpressissae-jestin-kanssa","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/helpot-javascript-yksikkoetestit-wordpressissae-jestin-kanssa\/","title":{"rendered":"Helpot JavaScript-yksikk\u00f6testit WordPressiss\u00e4 Jestin kanssa"},"content":{"rendered":"\n<p>WordPress on testannut PHP-koodiaan pitk\u00e4\u00e4n. JavaScript-yksikk\u00f6testien ja integrointitestien kirjoittaminen teemojen ja laajennusten koodille ei kuitenkaan ole samassa tilassa. Katsotaanpa, kuinka voit testata JavaScripti\u00e4 WordPress-laajennuksissamme ja teemoissamme Jestill\u00e4.<\/p>\n<p>T\u00e4ss\u00e4 artikkelissa k\u00e4sitell\u00e4\u00e4n seuraavia sis\u00e4lt\u00f6j\u00e4:<\/p>\n<h2>JavaScript-yksikk\u00f6testit WordPressiss\u00e4<\/h2>\n<p>Joten miksi kirjoittaa yksikk\u00f6testej\u00e4 ja integrointitestej\u00e4? Ne varmistavat erinomaisesti, ett\u00e4 funktio, luokkamenetelm\u00e4 tai jopa React-komponentti tekee sen, mit\u00e4 niiden pit\u00e4isi tehd\u00e4. Se auttaa havaitsemaan koodin virheet ja auttaa my\u00f6s s\u00e4ilytt\u00e4m\u00e4\u00e4n eheyden, kun koodiin my\u00f6hemmin tehd\u00e4\u00e4n muutoksia, varmistamalla, ett\u00e4 se toimii edelleen tarkoitetulla tavalla p\u00e4ivityksen j\u00e4lkeen.<\/p>\n<p><a href=\"https:\/\/startfunction.com\/category\/wordpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress<\/a> -laajennukset ja -teemat on kirjoitettu enimm\u00e4kseen PHP:ll\u00e4, ja ne voivat k\u00e4ytt\u00e4\u00e4 PHPUnit-ohjelmistoa testien suorittamiseen, v\u00e4itteiden tekemiseen, pilkkaamiseen ja muuhun. K\u00e4sikirjassa on jopa osio, jossa selitet\u00e4\u00e4n kuinka <a href=\"https:\/\/make.wordpress.org\/cli\/handbook\/plugin-unit-tests\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">yksikk\u00f6testaukset m\u00e4\u00e4ritet\u00e4\u00e4n nopeasti WP-CLI:n avulla<\/a>.<\/p>\n<p>JavaScriptille k\u00e4sikirjassa on sivu <a href=\"https:\/\/make.wordpress.org\/core\/handbook\/testing\/automated-testing\/qunit\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">QUnit-testien<\/a> suorittamisesta, vaikka kyse on enemm\u00e4n JavaScript-koodin testaamisesta WordPress-ytimess\u00e4.<\/p>\n<p>Vaikka mik\u00e4\u00e4n n\u00e4ist\u00e4 ei ole standardoitu JavaScriptille WordPressiss\u00e4, voimme kirjoittaa upeita yksikk\u00f6testej\u00e4 Jest-testausohjelmistolla. T\u00e4ss\u00e4 artikkelissa opimme kirjoittamaan JavaScript-yksikk\u00f6testej\u00e4 esimerkkilaajennukselle, joka lataa 5 viesti\u00e4 WP REST API:n <code>fetch<\/code>kautta JavaScript-funktion avulla ja render\u00f6i ne tietyss\u00e4 DOM-elementiss\u00e4 sivulla.<\/p>\n<h2>Jestin k\u00e4yt\u00f6n edut JavaScript-yksikk\u00f6testeiss\u00e4 WordPressiss\u00e4<\/h2>\n<p>Aiemmin JavaScript-yksikk\u00f6testien kirjoittamiseen sis\u00e4ltyi Mochan asettaminen suorittamaan testej\u00e4, Chai tekem\u00e4\u00e4n v\u00e4itteit\u00e4 ja Sinon pilkkaamaan toimintoja ja vakoilemaan niit\u00e4. Vaikka ne tarjoavat suurta joustavuutta, on paljon monimutkaisempaa ty\u00f6skennell\u00e4 kolmen paketin kuin yhden kanssa. <a href=\"https:\/\/jestjs.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Jest<\/a> tarjoaa kaiken t\u00e4m\u00e4n yhdess\u00e4 paketissa:<\/p>\n<ul>\n<li>voit suorittaa testej\u00e4 ja ilmoittaa ne n\u00e4pp\u00e4imill\u00e4 <code>describe<\/code>ja <code>it<\/code>tai<code>test<\/code><\/li>\n<li>voit tehd\u00e4 v\u00e4itteit\u00e4 &#8211; <code>expect<\/code>ja -painikkeilla <code>toBe<\/code>ja <code>toHaveLength<\/code>monilla muilla<\/li>\n<li>Voit pilkata toimintoja ja vakoilla niit\u00e4, ja t\u00e4h\u00e4n on useita tapoja<\/li>\n<\/ul>\n<h3>Ennen kuin jatkat<\/h3>\n<p>Jotta t\u00e4ss\u00e4 artikkelissa keskityt\u00e4\u00e4n testaamiseen Jestill\u00e4, testausprosessin ulkopuolisia lis\u00e4asetuksia, kuten Babel tai Webpack, ei k\u00e4sitell\u00e4 t\u00e4ss\u00e4. Kaikki t\u00e4m\u00e4 l\u00f6ytyy t\u00e4m\u00e4n artikkelin mukana <a href=\"https:\/\/github.com\/eliorivero\/wp-jest-tests\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tulevasta WP Jest Tests -repostiosta .<\/a> Jotta asiat pysyisiv\u00e4t asiayhteyden mukaisina, jokaisessa osiossa on linkki johonkin asiaankuuluvista tiedostoista, jotka kirjoitamme.<\/p>\n<h2>Yleiskatsaus PHP-puolelle<\/h2>\n<p>Esimerkkilaajennuksen <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,<\/a> jota k\u00e4yt\u00e4mme JavaScript-yksikk\u00f6testien kirjoittamiseen, on melko vakio. Ainoat mielenkiintoiset rivit ovat ne, kun asetamme JavaScript-tiedostomme jonoon ja lis\u00e4\u00e4mme tekstin sis\u00e4isen komentosarjan muuttujien v\u00e4litt\u00e4miseksi sille:<\/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>JavaScript-tiedostomme kyselyn j\u00e4lkeen lis\u00e4\u00e4mme globaalin muuttujan <code>wpJestTests<\/code>. <code>wp_add_inline_script()<\/code>T\u00e4m\u00e4 muuttuja on erityisen mielenkiintoinen ja hankala k\u00e4sitell\u00e4, koska se on JavaScript-tiedostomme ulkopuolinen ja meid\u00e4n on pilkattava sit\u00e4 testeiss\u00e4mme.<\/p>\n<h2>M\u00e4\u00e4rit\u00e4 Jest-testit<\/h2>\n<p>Meid\u00e4n on ensin alustettava <code>npm<\/code>laajennusprojektimme, jotta voimme asentaa Jestin sen kanssa. Siirry komentorivill\u00e4 laajennuskansioosi ja suorita:<\/p>\n<p><code>npm init<\/code>ja k\u00e4y l\u00e4pi kehotteet t\u00e4\u00e4lt\u00e4<\/p>\n<p>Muokkaa luotua <a href=\"https:\/\/github.com\/eliorivero\/wp-jest-tests\/blob\/master\/package.json\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">paketti.json<\/a> &#8211; tiedostoa ja lis\u00e4\u00e4 uusi merkint\u00e4 suorittaaksesi testimme <code>scripts<\/code>osiossa:<\/p>\n<p><code>\"test\": \"jest\"<\/code><\/p>\n<p>T\u00e4m\u00e4 on komento, jota k\u00e4yt\u00e4mme k\u00e4skem\u00e4\u00e4n Jesti\u00e4 suorittamaan JavaScript-yksikk\u00f6testit. T\u00e4m\u00e4 on kertak\u00e4ytt\u00f6inen, mutta Jest tukee my\u00f6s tiedostojen katselua, joten voit sy\u00f6tt\u00e4\u00e4 toisen:<\/p>\n<p><code>\"test-watch\": \"jest --watch\"<\/code><\/p>\n<p>Asenna nyt Jest kehitysriippuvuutena suorittamalla<\/p>\n<p><code>npm install -D jest<\/code><\/p>\n<p>Luo asennuksen aikana tiedosto nimelt\u00e4 <code>jest.config.js<\/code>. T\u00e4m\u00e4 s\u00e4ilytt\u00e4\u00e4 kaikki tarvittavat asetukset. Lis\u00e4\u00e4 seuraavat:<\/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>K\u00e4yd\u00e4\u00e4n l\u00e4pi jokainen:<\/p>\n<ul>\n<li><code>verbose<\/code>: osoittaa, tuleeko jokainen yksitt\u00e4inen testi raportoida ajon aikana. Kaikki virheet n\u00e4kyv\u00e4t my\u00f6s alareunassa suorituksen j\u00e4lkeen. Huomaa, ett\u00e4 jos k\u00e4ynniss\u00e4 on vain yksi testitiedosto, sen oletusarvo on <code>true<\/code>.<\/li>\n<li><code>setupFiles<\/code>: luettelo poluista moduuleille, jotka suorittavat koodia testausymp\u00e4rist\u00f6n m\u00e4\u00e4ritt\u00e4miseksi tai m\u00e4\u00e4ritt\u00e4miseksi. Jokainen setupFile ajetaan kerran testitiedostoa kohden. Koska jokainen testi suoritetaan omassa ymp\u00e4rist\u00f6ss\u00e4\u00e4n, n\u00e4m\u00e4 skriptit suoritetaan testausymp\u00e4rist\u00f6ss\u00e4 v\u00e4litt\u00f6m\u00e4sti ennen itse testikoodin suorittamista. K\u00e4yt\u00e4mme t\u00e4t\u00e4 ilmoittamaan PHP:n ja WordPressin render\u00f6im\u00e4t globaalit muuttujat komennoilla, kuten <code>wp_add_inline_script<\/code>tai <code>wp_localize_script<\/code>.<\/li>\n<li><code>moduleNameMapper<\/code>: t\u00e4m\u00e4 on kartta s\u00e4\u00e4nn\u00f6llisist\u00e4 lausekkeista moduulien nimiin (tai moduulien nimien joukkoihin), joiden avulla voidaan poistaa staattiset resurssit, kuten kuvat tai tyylit yhdell\u00e4 moduulilla.<\/li>\n<\/ul>\n<p>Huomasit varmasti viittauksen: t\u00e4m\u00e4 on erityinen merkki, jonka Jest korvaa projektisi juurella, joka on yleens\u00e4 <code>package.json<\/code>.<\/p>\n<p>Menemme perusteellisesti kahdessa seuraavassa osiossa, mutta luo ensin kansio ja n\u00e4m\u00e4 kaksi edell\u00e4 mainittua tiedostoa:<\/p>\n<ul>\n<li>luo kansio nimelt\u00e4<code>__mocks__<\/code><\/li>\n<li>luo kansion sis\u00e4ll\u00e4 tiedostot <code>styleMock.js<\/code>ja<code>globals.js<\/code><\/li>\n<\/ul>\n<h2>Mock tyylien tuonti Jest-testej\u00e4 varten<\/h2>\n<p>Jos k\u00e4yt\u00e4t Webpackia k\u00e4\u00e4nt\u00e4\u00e4ksesi kaiken, mukaan lukien tyylit, kuten t\u00e4m\u00e4n laajennuksen, ja tuot <code>.scss<\/code>tiedoston <code>.js<\/code>tiedostoon:<\/p>\n<pre><code>import '.\/main.scss';<\/code><\/pre>\n<p>sinun on k\u00e4ytett\u00e4v\u00e4 <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> :\u00e4\u00e4 pilkataksesi SASS-tiedostoja, kun tuot ne JavaScript-tiedostoomme, muuten Jest kaatuu, koska se ei pysty ratkaisemaan moduulia. Et tarvitse paljon t\u00e4h\u00e4n tiedostoon, lis\u00e4\u00e4 vain<\/p>\n<p>Jest k\u00e4ytt\u00e4\u00e4 t\u00e4t\u00e4 pilkkua joka kerta, kun se l\u00f6yt\u00e4\u00e4 <code>.scss<\/code>tuonnin, ja yhdist\u00e4\u00e4 ne malliin, jolloin voit siirty\u00e4 testeihin v\u00e4litt\u00e4m\u00e4tt\u00e4 tyyleist\u00e4.<\/p>\n<h2>Aseta globaalit Jestille<\/h2>\n<p>Ty\u00f6stet\u00e4\u00e4n nyt <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> tiedostoa. Yksi Jestin k\u00e4yt\u00f6n eduista on, ett\u00e4 se toimitetaan valmiiksi m\u00e4\u00e4ritetyn <code>jsdom<\/code>verkkostandardien puhtaan JavaScript-toteutuksen kanssa, joka simuloi DOM-ymp\u00e4rist\u00f6\u00e4 ik\u00e4\u00e4n kuin olisit selaimessa, ja k\u00e4yt\u00e4mme sit\u00e4 DOM-elementtien pilkkaamiseen. meid\u00e4n testej\u00e4 varten.<\/p>\n<p>Luo kansio <code>__mocks__<\/code>ja <code>globals.js<\/code>tiedosto sen sis\u00e4\u00e4n. Lis\u00e4\u00e4 t\u00e4m\u00e4 tiedostoon:<\/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>T\u00e4m\u00e4 ilmoittaa ja pilkaa joitain objekteja ja menetelmi\u00e4, joita k\u00e4yt\u00e4t my\u00f6hemmin testeiss\u00e4si. Viimeinen kiinnostaa erityisesti<\/p>\n<pre><code>global.window.wpJestTests = undefined;<\/code><\/pre>\n<p>T\u00e4m\u00e4 on globaali muuttuja, jonka kirjoitimme k\u00e4ytt\u00e4m\u00e4ll\u00e4 <code>wp_add_inline_script<\/code>. Sinun t\u00e4ytyy pilkata sit\u00e4 globaaliksi muuttujaksi, jotta voit k\u00e4ytt\u00e4\u00e4 sit\u00e4 testeiss\u00e4si.<\/p>\n<h2>JavaScript-tiedoston yleiskatsaus<\/h2>\n<p>WordPress-laajennuksen kansiossa on yksi JavaScript-tiedosto <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> <code>\/src<\/code>T\u00e4m\u00e4 siirret\u00e4\u00e4n my\u00f6hemmin ja tulostetaan <code>\/js\/front.js<\/code>tiedostoon, jonka PHP lataa. JavaScript lataa viisi WordPress-viesti\u00e4 k\u00e4ytt\u00e4m\u00e4ll\u00e4 <code>fetch<\/code>tavallista JavaScript-toimintoa WP REST API:n kautta ja lis\u00e4\u00e4 otsikon, jossa on linkki viestiin, <code>div.entry-content<\/code>.<\/p>\n<p>Aiot vied\u00e4 funktion, joka tekee kaiken ty\u00f6n:<\/p>\n<pre><code>export const wpJestTestsInit =() =&gt; {<\/code><\/pre>\n<p>joten voit k\u00e4ytt\u00e4\u00e4 sit\u00e4 testeiss\u00e4si Jestiss\u00e4.<\/p>\n<h2>JavaScript-yksikk\u00f6testien kirjoittaminen Jestill\u00e4, vihdoin!<\/h2>\n<p>Nyt voit aloittaa kokeiden kirjoittamisen! Jest voi l\u00f6yt\u00e4\u00e4 testej\u00e4 monella tavalla:<\/p>\n<ul>\n<li>jos tiedoston nimi on<code>test.js<\/code><\/li>\n<li>tai sen etuliitteen\u00e4 on testattavan tiedoston nimi, kuten<code>main.test.js<\/code><\/li>\n<li>jos ne ovat <code>.js<\/code>tiedostoja, jotka sijaitsevat kansiossa nimelt\u00e4<code>__tests__<\/code><\/li>\n<\/ul>\n<p>Luo <code>__tests__<\/code>kansio ja sen sis\u00e4ll\u00e4 <code>front.test.js<\/code>. N\u00e4et <a href=\"https:\/\/github.com\/eliorivero\/wp-jest-tests\/blob\/master\/__tests__\/front.test.js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">valmiin JavaScript-tiedoston Jest-testej\u00e4<\/a> varten t\u00e4ydent\u00e4v\u00e4ss\u00e4 repossa. K\u00e4yd\u00e4\u00e4n se l\u00e4pi lohkoissa. Ensimm\u00e4inen rivi tuo JS-tiedoston, jonka haluamme testata:<\/p>\n<pre><code>import { wpJestTestsInit } from '..\/src\/main';<\/code><\/pre>\n<p>Seuraavaksi tyhjenn\u00e4mme kaikki pilkat, joten emme koskaan juokse likaisten pilkkien kanssa, jotka sis\u00e4lt\u00e4v\u00e4t arvoja aikaisemmista testeist\u00e4. T\u00e4m\u00e4 voi johtaa virheisiin, koska esimerkiksi jos vakoilemme, kuinka monta kertaa pilkattua funktiota kutsuttiin, voimme saada virheellisen lukeman, jos emme poista pilaa testin ja testin v\u00e4lill\u00e4:<\/p>\n<pre><code>afterEach(() =&gt; {\n    jest.clearAllMocks();\n} );<\/code><\/pre>\n<p>Ensimm\u00e4inen testi, jonka kirjoitamme, tekee perusv\u00e4itteit\u00e4, kun jotkut asiat ep\u00e4onnistuvat. Jos esimerkiksi globaalia <code>wpJestTests<\/code>muuttujaa, jolla kirjoitimme, <code>wp_add_inline_script<\/code>ei kirjoitettu jostain syyst\u00e4:<\/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>T\u00e4ss\u00e4 koodissa<\/p>\n<ul>\n<li><code>describe<\/code>luo ryhm\u00e4n, joka koostuu useista toisiinsa liittyvist\u00e4 testeist\u00e4<\/li>\n<li><code>test<\/code>on se, mik\u00e4 todella suorittaa testin<\/li>\n<li><code>expect<\/code>kaataa testikohdeemme tarjoamalla p\u00e4\u00e4syn useisiin &quot;vastaaviin&quot;, joiden avulla voit tehd\u00e4 erilaisia \u200b\u200bv\u00e4itteit\u00e4 sen sis\u00e4ll\u00f6st\u00e4<\/li>\n<li><code>toBe<\/code>on yksi n\u00e4ist\u00e4 vastaajista. <a href=\"https:\/\/jestjs.io\/docs\/en\/expect\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Jestiss\u00e4 on mukana<\/a> paljon vastaavia, ja on jopa muita, jotka voit lis\u00e4t\u00e4 <a href=\"https:\/\/github.com\/jest-community\/jest-extended#jest-extended\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kolmannen osapuolen paketilla<\/a>.<\/li>\n<\/ul>\n<p>Ensimm\u00e4inen testi ei m\u00e4\u00e4rittele mit\u00e4\u00e4n, <code>wpJestTests<\/code>joten sen arvo on se, mit\u00e4 m\u00e4\u00e4ritit kohdassa <code>globals.js<\/code>. Koska se on <code>undefined<\/code>, emme voi toimia, joten haluamme varmistaa, ett\u00e4 funktio palaa tekem\u00e4tt\u00e4 mit\u00e4\u00e4n.<\/p>\n<p>Toinen testi m\u00e4\u00e4rittelee <code>wpJestTests<\/code>ja pilkkaa <code>document.querySelector<\/code>palautusmenetelm\u00e4n, <code>undefined<\/code>jonka se palauttaisi, jos se ei l\u00f6yd\u00e4 elementti\u00e4 DOM:sta. Siin\u00e4 tapauksessa haluamme vahvistaa, ett\u00e4 palaamme tekem\u00e4tt\u00e4 mit\u00e4\u00e4n ja ett\u00e4 funktiomme pilkkaaminen <code>document.querySelector<\/code>kutsuttiin kerran.<\/p>\n<h2>Mock fetch Jest-testeiss\u00e4<\/h2>\n<p>Seuraava testisarja alkaa<\/p>\n<pre><code>describe( 'Fetch posts', () =&gt; {<\/code><\/pre>\n<p>ja t\u00e4m\u00e4n sis\u00e4ll\u00e4 meill\u00e4 on toinen purkaustoiminto:<\/p>\n<pre><code>afterAll( () =&gt; {\n    global.fetch.mockClear();\n    delete global.fetch;\n});<\/code><\/pre>\n<p>toisin kuin t\u00e4m\u00e4, se suoritetaan, kun kaikki t\u00e4m\u00e4n lohkon <code>afterEach<\/code>testit on suoritettu. <code>describe<\/code>Koska JavaScript-tiedostomme <code>fetch<\/code>lataa viestit, meid\u00e4n on varmistettava, ett\u00e4 sit\u00e4 kutsuttiin ja se palautti pyyt\u00e4m\u00e4mme, joten pilkkaamme <code>fetch<\/code>toimintoa:<\/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>Pilkkaamme ensimm\u00e4ist\u00e4 lupausta, joka ratkaisee vastauksen, ja toista tietojen JSON-esityst\u00e4 varten. N\u00e4m\u00e4 tiedot ovat samanlaisia \u200b\u200bkuin mit\u00e4 saamme WP REST API:sta. Koska koodimme tarvitsee vain otsikon ja linkin, pilkkaamme sit\u00e4.<\/p>\n<h2>JavaScript-integraatiotesti Jestin kanssa asynkronisessa koodissa, joka k\u00e4ytt\u00e4\u00e4 noutoa<\/h2>\n<p>Voimme nyt kirjoittaa testin k\u00e4ytt\u00e4m\u00e4ll\u00e4 pilkattua <code>fetch<\/code>. T\u00e4ss\u00e4 testiss\u00e4 on suuri ero muihin JavaScript-yksikk\u00f6testeihin verrattuna: t\u00e4m\u00e4 on integrointitesti. T\u00e4ss\u00e4 tutkitut aiemmat testit yksinkertaisesti varmistivat, ett\u00e4 komponentti toimi hyvin. Tarkistimme, ett\u00e4 jos alkutilan globaalia muuttujaa ei ole m\u00e4\u00e4ritetty, komponenttimme ei hahmonnu. T\u00e4m\u00e4 on erilainen, koska aiomme testata, kuinka koko j\u00e4rjestelm\u00e4 toimii, kun alkutilamuuttuja on m\u00e4\u00e4ritetty, k\u00e4ynnist\u00e4en n\u00e4in datatapahtuman ja lis\u00e4\u00e4m\u00e4ll\u00e4 lopuksi viestien otsikot linkkeineen dokumenttiin.<\/p>\n<p>Heti alusta l\u00e4htien t\u00e4m\u00e4 on erilaista: nimet\u00f6n funktio <code>test<\/code>vastaanottaa <code>done<\/code>parametrin. T\u00e4m\u00e4 on itse asiassa funktio, jota kutsutaan, kun lopetamme testin. Jest odottaa, kunnes h\u00e4nt\u00e4 <code>done<\/code>kutsutaan ennen testin suorittamista. Jos <code>done<\/code>sit\u00e4 ei koskaan kutsuta, testi ep\u00e4onnistuu aikakatkaisuvirheen vuoksi. Se on meille mielenkiintoista, koska testaamme koodia <code>fetch<\/code>, joka sis\u00e4lt\u00e4\u00e4 asynkronisen 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>Globaali <code>wpJestTests<\/code>on m\u00e4\u00e4ritelty ja pilkattu <code>document.querySelector<\/code>nyt palauttaa sen, mik\u00e4 muistuttaa HTML-elementti\u00e4, parillinen <code>classList<\/code>ja sen <code>add<\/code>alimetodi.<\/p>\n<p>Soitamme <code>wpJestTestsInit<\/code>ja odotamme sen p\u00e4\u00e4ttyv\u00e4n oikein. Nyt, koska <code>fetch<\/code>se on asynkroninen, aiomme hy\u00f6dynt\u00e4\u00e4 <code>process.nextTick<\/code>Node.js <a href=\"https:\/\/nodejs.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">:<\/a> sta. Node.js: <code>nextTick<\/code>ss\u00e4 on jono, joka suoritetaan sen j\u00e4lkeen, kun kaikki nykyisen tapahtumasilmukan tapahtumat on suoritettu. T\u00e4m\u00e4 on hienoa, koska kaikki lupauksemme ratkaistaan \u200b\u200bsilloin, mik\u00e4 on juuri sit\u00e4, mit\u00e4 tarvitsemme testataksemme t\u00e4t\u00e4 koodia, johon sis\u00e4ltyy <code>fetch<\/code>.<\/p>\n<p>Loput ovat enemm\u00e4n v\u00e4itteit\u00e4, joilla varmistetaan, ett\u00e4 <code>querySelector<\/code>l\u00f6ytyi jotain ty\u00f6stett\u00e4v\u00e4\u00e4, jota <code>fetch<\/code>todellakin kutsuttiin, ett\u00e4 luokka lis\u00e4ttiin luetteloon ja ett\u00e4 viestiemme otsikot ja linkit lis\u00e4ttiin vastaavaan HTML-elementtiin. Kun kaikki on tehty, soitamme <code>done<\/code>ja asynkroninen testimme p\u00e4\u00e4ttyy.<\/p>\n<h2>Suorita Jest-testit<\/h2>\n<p>Nyt voit kirjoittaa<\/p>\n<p><code>npm run test<\/code><\/p>\n<p>ja Jest suorittaa JavaScript-yksikk\u00f6testit WordPress-laajennuksellesi<\/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=\"Helpot JavaScript-yksikk\u00f6testit WordPressiss\u00e4 Jestin kanssa\" ><\/a><\/p>\n<h2>Johtop\u00e4\u00e4t\u00f6s<\/h2>\n<p>Jest on siis loistava ja yksinkertainen ratkaisu WordPress-laajennuksiemme tai teemoidemme JavaScript-koodin kattavien testien kirjoittamiseen. Mutta on muutakin. Jos kirjoitamme React-sovellusta laajennuksellemme, saatamme haluta esitt\u00e4\u00e4 v\u00e4itteit\u00e4 siit\u00e4. Jest voi my\u00f6s auttaa jossain m\u00e4\u00e4rin, ja jos tarvitsemme lis\u00e4\u00e4, voimme lis\u00e4t\u00e4 Enzymen ty\u00f6kaluihimme ja alkaa kirjoittaa integraatiotestej\u00e4 sen avulla.<\/p>\n<p>Ole hyv\u00e4 ja lahjoita!<\/p>\n<p>Jos pidit t\u00e4st\u00e4 hy\u00f6dyllisen\u00e4, osta minulle kahvia, <img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" alt=\"Helpot JavaScript-yksikk\u00f6testit WordPressiss\u00e4 Jestin kanssa\" \/>jotta voin pysy\u00e4 hereill\u00e4 ja luoda sinulle hy\u00f6dyllisi\u00e4 opetusohjelmia!<\/p>\n<p>3,00 dollaria<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/startfunction.com\" class=\"external external_icon\">startfunction.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Varmista JavaScript-koodin vakaus WordPress-laajennuksessasi kirjoittamalla JavaScript-yksikk\u00f6testej\u00e4 Jestill\u00e4.<\/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":[750,1018,730,719,895,843,864],"tags":[1166],"class_list":["post-232236","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-avoin-laehdekoodi","category-hyodyllisia-sivustoja","category-javascript-5","category-kehittaejae","category-koodi","category-opetusohjelmia","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/232236","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=232236"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/232236\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/157898"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=232236"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=232236"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=232236"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}