Kratak vodič kroz Unit testiranje u Javascriptu za radoznale - 2. deo
U 1. delu smo se upoznali sa osnovnim funkcionalnostima JS framework-a za testiranje Mocha. U ovom delu ćemo probati da testiramo malo kompleksnije stvari.
Testiranje objekata
Recimo da hoćemo da uporedimo 2 objekta. Should nam to omogućava. Kreiraću dva objekta koji će imati nekoliko property-ja i uporediti ih.
Test, nije prošao, što i nije ništa neočekivano. Ok, ali hajde sad da dodamo treći objekat koji će biti identičan kao prvi.
Nakon pokretanja
npm run test
ipak fail? 🤔 Hmm, zašto test nije prošao iako su objekti identični? Zato što u poređenju 2 objekta u Javascript-u rezultat će jedino biti true ukoliko objekti referenciraju na istu lokaciju u memoriji. Odnosno naš test bi bio prolazan ukoliko bi naš objekat bio jedino deklarisan ovako:
const movieThree = movieOne;
.
Ok, ali ovde cilj nije poređenje takvih objekata, već prolaznost testa ukoliko su moji objekti isti, iako ne pokazuju na istu lokaciju. Chai nam nudi opciju deep equal, koji radi upravo to. I sada ukoliko uporedimo objekat movieOne sa movieThree
movieOne.should.deep.equal(movieThree);
naš test je uspešan. 👍🏼
Unit testovi i Typescript
Sada ćemo otići korak dalje i kreirati testove u objektno orijentisanom okruženju Typescript-a 👨🏼💻. Ono što će biti potrebno uraditi je instalirati sam typescript paket, a zatim i postojeće pakete (mocha, chai) prilagođene za typescript. Naš package.json fajl će nakon instalacija svih paketa izgledati ovako:
Ono što se može još primetiti je da je izmenjena i naša test skripta, tj. da je prilagođena za pokretanje test fajla u typescript-u (
"test": "mocha -r ts-node/register \"test/**/*.spec.ts\""
).
Nakon ovoga je potreban još jedan korak za konfigurisanje, a to je kreiranje tsconfig.json fajla, koji predstavlja naš root fajl za opcijama za kompajler i koji izgleda ovako:
Ok, hajde da napravimo klasu Movie.ts u src folderu koja će imati nekoliko property-ja i 2 funkcije (jednu za ocenjivanje filma i drugu koja će vraćati prosečni rejting). To će izgledati ovako:
Potom ćemo preimenovati naš test fajl u
index.spec.ts
i u test case-u kreirati instancu naše Movie klase:
const movieOne = new Movie('Arrival', 'Sci-Fi');
. Zatim ćemo dodati par rejtinga za naš novokreirani objekat:
movieOne.rateMovie(8);
movieOne.rateMovie(9.5);
movieOne.rateMovie(7);
i pozvati funkciju getAverageRating koja će nam vratiti prosečan rejting
const result = movieOne.getAverageRating();
. Nakon što sam sačuvao vrednost u varijabli result, poredim je sa vrednosću koju očekujem da dobijem i nadam se da će moj test biti prolazan.
Nakon pokretanja test, naš test prolazi uspešno
Još samo da proverimo da li će fail biti rezultat našeg testa ukoliko se vrednosti ne budu slagale, kao u ovoj situaciji:
assert.equal(result, 10);
.
Pa da probamo
I sve je prošlo po planu 😎. To je sve za ovaj put.
U sledećem delu ćemo testirati nešto realnije. Vidimo se 👋