Helpot JavaScript-yksikkötestit WordPressissä Jestin kanssa
WordPress on testannut PHP-koodiaan pitkään. JavaScript-yksikkötestien ja integrointitestien kirjoittaminen teemojen ja laajennusten koodille ei kuitenkaan ole samassa tilassa. Katsotaanpa, kuinka voit testata JavaScriptiä WordPress-laajennuksissamme ja teemoissamme Jestillä.
Tässä artikkelissa käsitellään seuraavia sisältöjä:
JavaScript-yksikkötestit WordPressissä
Joten miksi kirjoittaa yksikkötestejä ja integrointitestejä? Ne varmistavat erinomaisesti, että funktio, luokkamenetelmä tai jopa React-komponentti tekee sen, mitä niiden pitäisi tehdä. Se auttaa havaitsemaan koodin virheet ja auttaa myös säilyttämään eheyden, kun koodiin myöhemmin tehdään muutoksia, varmistamalla, että se toimii edelleen tarkoitetulla tavalla päivityksen jälkeen.
WordPress -laajennukset ja -teemat on kirjoitettu enimmäkseen PHP:llä, ja ne voivat käyttää PHPUnit-ohjelmistoa testien suorittamiseen, väitteiden tekemiseen, pilkkaamiseen ja muuhun. Käsikirjassa on jopa osio, jossa selitetään kuinka yksikkötestaukset määritetään nopeasti WP-CLI:n avulla.
JavaScriptille käsikirjassa on sivu QUnit-testien suorittamisesta, vaikka kyse on enemmän JavaScript-koodin testaamisesta WordPress-ytimessä.
Vaikka mikään näistä ei ole standardoitu JavaScriptille WordPressissä, voimme kirjoittaa upeita yksikkötestejä Jest-testausohjelmistolla. Tässä artikkelissa opimme kirjoittamaan JavaScript-yksikkötestejä esimerkkilaajennukselle, joka lataa 5 viestiä WP REST API:n fetch
kautta JavaScript-funktion avulla ja renderöi ne tietyssä DOM-elementissä sivulla.
Jestin käytön edut JavaScript-yksikkötesteissä WordPressissä
Aiemmin JavaScript-yksikkötestien kirjoittamiseen sisältyi Mochan asettaminen suorittamaan testejä, Chai tekemään väitteitä ja Sinon pilkkaamaan toimintoja ja vakoilemaan niitä. Vaikka ne tarjoavat suurta joustavuutta, on paljon monimutkaisempaa työskennellä kolmen paketin kuin yhden kanssa. Jest tarjoaa kaiken tämän yhdessä paketissa:
- voit suorittaa testejä ja ilmoittaa ne näppäimillä
describe
jait
taitest
- voit tehdä väitteitä –
expect
ja -painikkeillatoBe
jatoHaveLength
monilla muilla - Voit pilkata toimintoja ja vakoilla niitä, ja tähän on useita tapoja
Ennen kuin jatkat
Jotta tässä artikkelissa keskitytään testaamiseen Jestillä, testausprosessin ulkopuolisia lisäasetuksia, kuten Babel tai Webpack, ei käsitellä tässä. Kaikki tämä löytyy tämän artikkelin mukana tulevasta WP Jest Tests -repostiosta . Jotta asiat pysyisivät asiayhteyden mukaisina, jokaisessa osiossa on linkki johonkin asiaankuuluvista tiedostoista, jotka kirjoitamme.
Yleiskatsaus PHP-puolelle
Esimerkkilaajennuksen PHP, jota käytämme JavaScript-yksikkötestien kirjoittamiseen, on melko vakio. Ainoat mielenkiintoiset rivit ovat ne, kun asetamme JavaScript-tiedostomme jonoon ja lisäämme tekstin sisäisen komentosarjan muuttujien välittämiseksi sille:
JavaScript-tiedostomme kyselyn jälkeen lisäämme globaalin muuttujan wpJestTests
. wp_add_inline_script()
Tämä muuttuja on erityisen mielenkiintoinen ja hankala käsitellä, koska se on JavaScript-tiedostomme ulkopuolinen ja meidän on pilkattava sitä testeissämme.
Määritä Jest-testit
Meidän on ensin alustettava npm
laajennusprojektimme, jotta voimme asentaa Jestin sen kanssa. Siirry komentorivillä laajennuskansioosi ja suorita:
npm init
ja käy läpi kehotteet täältä
Muokkaa luotua paketti.json – tiedostoa ja lisää uusi merkintä suorittaaksesi testimme scripts
osiossa:
"test": "jest"
Tämä on komento, jota käytämme käskemään Jestiä suorittamaan JavaScript-yksikkötestit. Tämä on kertakäyttöinen, mutta Jest tukee myös tiedostojen katselua, joten voit syöttää toisen:
"test-watch": "jest --watch"
Asenna nyt Jest kehitysriippuvuutena suorittamalla
npm install -D jest
Luo asennuksen aikana tiedosto nimeltä jest.config.js
. Tämä säilyttää kaikki tarvittavat asetukset. Lisää seuraavat:
module.exports = {
verbose: true,
setupFiles: [
'/__mocks__/globals.js'
],
moduleNameMapper: {
'.(css|less|sass|scss)$': '/__mocks__/styleMock.js'
}
};
Käydään läpi jokainen:
verbose
: osoittaa, tuleeko jokainen yksittäinen testi raportoida ajon aikana. Kaikki virheet näkyvät myös alareunassa suorituksen jälkeen. Huomaa, että jos käynnissä on vain yksi testitiedosto, sen oletusarvo ontrue
.setupFiles
: luettelo poluista moduuleille, jotka suorittavat koodia testausympäristön määrittämiseksi tai määrittämiseksi. Jokainen setupFile ajetaan kerran testitiedostoa kohden. Koska jokainen testi suoritetaan omassa ympäristössään, nämä skriptit suoritetaan testausympäristössä välittömästi ennen itse testikoodin suorittamista. Käytämme tätä ilmoittamaan PHP:n ja WordPressin renderöimät globaalit muuttujat komennoilla, kutenwp_add_inline_script
taiwp_localize_script
.moduleNameMapper
: tämä on kartta säännöllisistä lausekkeista moduulien nimiin (tai moduulien nimien joukkoihin), joiden avulla voidaan poistaa staattiset resurssit, kuten kuvat tai tyylit yhdellä moduulilla.
Huomasit varmasti viittauksen: tämä on erityinen merkki, jonka Jest korvaa projektisi juurella, joka on yleensä package.json
.
Menemme perusteellisesti kahdessa seuraavassa osiossa, mutta luo ensin kansio ja nämä kaksi edellä mainittua tiedostoa:
- luo kansio nimeltä
__mocks__
- luo kansion sisällä tiedostot
styleMock.js
jaglobals.js
Mock tyylien tuonti Jest-testejä varten
Jos käytät Webpackia kääntääksesi kaiken, mukaan lukien tyylit, kuten tämän laajennuksen, ja tuot .scss
tiedoston .js
tiedostoon:
import './main.scss';
sinun on käytettävä styleMock.js :ää pilkataksesi SASS-tiedostoja, kun tuot ne JavaScript-tiedostoomme, muuten Jest kaatuu, koska se ei pysty ratkaisemaan moduulia. Et tarvitse paljon tähän tiedostoon, lisää vain
Jest käyttää tätä pilkkua joka kerta, kun se löytää .scss
tuonnin, ja yhdistää ne malliin, jolloin voit siirtyä testeihin välittämättä tyyleistä.
Aseta globaalit Jestille
Työstetään nyt globals.js- tiedostoa. Yksi Jestin käytön eduista on, että se toimitetaan valmiiksi määritetyn jsdom
verkkostandardien puhtaan JavaScript-toteutuksen kanssa, joka simuloi DOM-ympäristöä ikään kuin olisit selaimessa, ja käytämme sitä DOM-elementtien pilkkaamiseen. meidän testejä varten.
Luo kansio __mocks__
ja globals.js
tiedosto sen sisään. Lisää tämä tiedostoon:
import { JSDOM } from 'jsdom';
const dom = new JSDOM();
global.document = dom.window.document;
global.window = dom.window;
global.window.wpJestTests = undefined;
Tämä ilmoittaa ja pilkaa joitain objekteja ja menetelmiä, joita käytät myöhemmin testeissäsi. Viimeinen kiinnostaa erityisesti
global.window.wpJestTests = undefined;
Tämä on globaali muuttuja, jonka kirjoitimme käyttämällä wp_add_inline_script
. Sinun täytyy pilkata sitä globaaliksi muuttujaksi, jotta voit käyttää sitä testeissäsi.
JavaScript-tiedoston yleiskatsaus
WordPress-laajennuksen kansiossa on yksi JavaScript-tiedosto main.js. /src
Tämä siirretään myöhemmin ja tulostetaan /js/front.js
tiedostoon, jonka PHP lataa. JavaScript lataa viisi WordPress-viestiä käyttämällä fetch
tavallista JavaScript-toimintoa WP REST API:n kautta ja lisää otsikon, jossa on linkki viestiin, div.entry-content
.
Aiot viedä funktion, joka tekee kaiken työn:
joten voit käyttää sitä testeissäsi Jestissä.
JavaScript-yksikkötestien kirjoittaminen Jestillä, vihdoin!
Nyt voit aloittaa kokeiden kirjoittamisen! Jest voi löytää testejä monella tavalla:
- jos tiedoston nimi on
test.js
- tai sen etuliitteenä on testattavan tiedoston nimi, kuten
main.test.js
- jos ne ovat
.js
tiedostoja, jotka sijaitsevat kansiossa nimeltä__tests__
Luo __tests__
kansio ja sen sisällä front.test.js
. Näet valmiin JavaScript-tiedoston Jest-testejä varten täydentävässä repossa. Käydään se läpi lohkoissa. Ensimmäinen rivi tuo JS-tiedoston, jonka haluamme testata:
import { wpJestTestsInit } from '../src/main';
Seuraavaksi tyhjennämme kaikki pilkat, joten emme koskaan juokse likaisten pilkkien kanssa, jotka sisältävät arvoja aikaisemmista testeistä. Tämä 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älillä:
Ensimmäinen testi, jonka kirjoitamme, tekee perusväitteitä, kun jotkut asiat epäonnistuvat. Jos esimerkiksi globaalia wpJestTests
muuttujaa, jolla kirjoitimme, wp_add_inline_script
ei kirjoitettu jostain syystä:
Tässä koodissa
describe
luo ryhmän, joka koostuu useista toisiinsa liittyvistä testeistätest
on se, mikä todella suorittaa testinexpect
kaataa testikohdeemme tarjoamalla pääsyn useisiin "vastaaviin", joiden avulla voit tehdä erilaisia väitteitä sen sisällöstätoBe
on yksi näistä vastaajista. Jestissä on mukana paljon vastaavia, ja on jopa muita, jotka voit lisätä kolmannen osapuolen paketilla.
Ensimmäinen testi ei määrittele mitään, wpJestTests
joten sen arvo on se, mitä määritit kohdassa globals.js
. Koska se on undefined
, emme voi toimia, joten haluamme varmistaa, että funktio palaa tekemättä mitään.
Toinen testi määrittelee wpJestTests
ja pilkkaa document.querySelector
palautusmenetelmän, undefined
jonka se palauttaisi, jos se ei löydä elementtiä DOM:sta. Siinä tapauksessa haluamme vahvistaa, että palaamme tekemättä mitään ja että funktiomme pilkkaaminen document.querySelector
kutsuttiin kerran.
Mock fetch Jest-testeissä
Seuraava testisarja alkaa
ja tämän sisällä meillä on toinen purkaustoiminto:
toisin kuin tämä, se suoritetaan, kun kaikki tämän lohkon afterEach
testit on suoritettu. describe
Koska JavaScript-tiedostomme fetch
lataa viestit, meidän on varmistettava, että sitä kutsuttiin ja se palautti pyytämämme, joten pilkkaamme fetch
toimintoa:
Pilkkaamme ensimmäistä lupausta, joka ratkaisee vastauksen, ja toista tietojen JSON-esitystä varten. Nämä tiedot ovat samanlaisia kuin mitä saamme WP REST API:sta. Koska koodimme tarvitsee vain otsikon ja linkin, pilkkaamme sitä.
JavaScript-integraatiotesti Jestin kanssa asynkronisessa koodissa, joka käyttää noutoa
Voimme nyt kirjoittaa testin käyttämällä pilkattua fetch
. Tässä testissä on suuri ero muihin JavaScript-yksikkötesteihin verrattuna: tämä on integrointitesti. Tässä tutkitut aiemmat testit yksinkertaisesti varmistivat, että komponentti toimi hyvin. Tarkistimme, että jos alkutilan globaalia muuttujaa ei ole määritetty, komponenttimme ei hahmonnu. Tämä on erilainen, koska aiomme testata, kuinka koko järjestelmä toimii, kun alkutilamuuttuja on määritetty, käynnistäen näin datatapahtuman ja lisäämällä lopuksi viestien otsikot linkkeineen dokumenttiin.
Heti alusta lähtien tämä on erilaista: nimetön funktio test
vastaanottaa done
parametrin. Tämä on itse asiassa funktio, jota kutsutaan, kun lopetamme testin. Jest odottaa, kunnes häntä done
kutsutaan ennen testin suorittamista. Jos done
sitä ei koskaan kutsuta, testi epäonnistuu aikakatkaisuvirheen vuoksi. Se on meille mielenkiintoista, koska testaamme koodia fetch
, joka sisältää asynkronisen funktion.
Globaali wpJestTests
on määritelty ja pilkattu document.querySelector
nyt palauttaa sen, mikä muistuttaa HTML-elementtiä, parillinen classList
ja sen add
alimetodi.
Soitamme wpJestTestsInit
ja odotamme sen päättyvän oikein. Nyt, koska fetch
se on asynkroninen, aiomme hyödyntää process.nextTick
Node.js : sta. Node.js: nextTick
ssä on jono, joka suoritetaan sen jälkeen, kun kaikki nykyisen tapahtumasilmukan tapahtumat on suoritettu. Tämä on hienoa, koska kaikki lupauksemme ratkaistaan silloin, mikä on juuri sitä, mitä tarvitsemme testataksemme tätä koodia, johon sisältyy fetch
.
Loput ovat enemmän väitteitä, joilla varmistetaan, että querySelector
löytyi jotain työstettävää, jota fetch
todellakin kutsuttiin, että luokka lisättiin luetteloon ja että viestiemme otsikot ja linkit lisättiin vastaavaan HTML-elementtiin. Kun kaikki on tehty, soitamme done
ja asynkroninen testimme päättyy.
Suorita Jest-testit
Nyt voit kirjoittaa
npm run test
ja Jest suorittaa JavaScript-yksikkötestit WordPress-laajennuksellesi
Johtopäätös
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ää väitteitä siitä. Jest voi myös auttaa jossain määrin, ja jos tarvitsemme lisää, voimme lisätä Enzymen työkaluihimme ja alkaa kirjoittaa integraatiotestejä sen avulla.
Ole hyvä ja lahjoita!
Jos pidit tästä hyödyllisenä, osta minulle kahvia, jotta voin pysyä hereillä ja luoda sinulle hyödyllisiä opetusohjelmia!
3,00 dollaria