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.

objects.jpg

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.

01.PNG

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.

02.PNG

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: 07.PNG

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:

08.PNG

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:

03.PNG

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.

04.PNG

Nakon pokretanja test, naš test prolazi uspešno 05.PNG

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 06.PNG

I sve je prošlo po planu 😎. To je sve za ovaj put.

U sledećem delu ćemo testirati nešto realnije. Vidimo se 👋