AngularJS Unit Testing: Karma Jasmine Tutorial
En av de mest strรฅlende funksjonene til Angular.JS er Testing aspekt. Da utviklerne hos Google utviklet AngularJS, holdt de testingen i tankene og sรธrget for at hele AngularJS-rammeverket var testbart.
I AngularJS utfรธres testing normalt ved hjelp av Karma (rammeverk). Angular JS-testing kan utfรธres uten Karma, men Karma-rammeverket har en sรฅ glimrende funksjonalitet for รฅ teste AngularJS-kode, at det er fornuftig รฅ bruke dette rammeverket.
- I AngularJS kan vi opptre Enhetstesting separat for kontrollere og direktiver.
- Vi kan ogsรฅ utfรธre end of end-testing av AngularJS, som er testing fra et brukerperspektiv.
Introduksjon og installasjon av Karma-rammeverket
Karma er en testing av automatiseringsverktรธy opprettet av Angular JS-teamet hos Google. Det fรธrste trinnet for รฅ bruke Karma er รฅ installere Karma. Karma installeres via npm (som er en pakkebehandling som brukes for enkel installasjon av moduler pรฅ en lokal maskin).
Installasjon av Karma
Installasjonen av Karma via npm gjรธres i en to-trinns prosess.
Trinn 1) Utfรธr linjen under fra kommandolinjen
npm install karma karma-chrome-launcher karma-jasmine
hvori,
- npm er kommandolinjeverktรธyet for nodepakkebehandleren som brukes til รฅ installere tilpassede moduler pรฅ hvilken som helst maskin.
- Installasjonsparameteren instruerer npm-kommandolinjeverktรธyet om at installasjon er nรธdvendig.
- Det er 3 biblioteker som er spesifisert pรฅ kommandolinjen som kreves for รฅ jobbe med karma.
- karma er kjernebiblioteket som vil bli brukt til testformรฅl.
- karma-chrome-launcher er et eget bibliotek som gjรธr det mulig รฅ gjenkjenne karma-kommandoer av chrome-nettleseren.
- karma-jasmin โ Dette installerer jasmin som er et avhengig rammeverk for karma.
Trinn 2) Det neste trinnet er รฅ installere kommandolinjeverktรธyet karma. Dette er nรธdvendig for รฅ utfรธre karmalinjekommandoer. Karmalinjeverktรธyet vil bli brukt til รฅ initialisere karmamiljรธet for testing.
For รฅ installere kommandolinjeverktรธyet, kjรธr linjen nedenfor fra kommandolinjen
npm install karma-cli
hvori,
Konfigurasjon av Karma-rammeverket
Det neste trinnet er รฅ konfigurere karma som kan gjรธres via kommandoen
"karma โinit"
Etter at trinnet ovenfor er utfรธrt, vil karma lage en karma.conf.js-fil. Filen vil sannsynligvis se ut som kodebiten vist nedenfor
files: [ 'Your application Name'/AngularJS/AngularJS.js', 'Your application Name'/AngularJS-mocks/AngularJS-mocks.js', 'lib/app.js', 'tests/*.js' ]
Konfigurasjonsfilene ovenfor forteller karma runtime-motoren fรธlgende ting
- "Ditt programnavn" โ Dette vil bli erstattet av navnet pรฅ sรธknaden din.
- 'Applikasjonsnavnet'/AngularJS/AngularJS.js' โ Dette forteller karma at applikasjonen din avhenger av kjernemodulene i AngularJS
- 'Ditt programnavn'/AngularJS-mocks/AngularJS-mocks.js' โ Dette forteller karma รฅ bruke Unit Testing-funksjonaliteten for AngularJS fra Angular.JS-mocks.js-filen.
- Alle hovedapplikasjons- eller forretningslogikkfilene er til stede i lib-mappen til applikasjonen din.
- Testmappen vil inneholde alle enhetstestene.
For รฅ sjekke om karma fungerer, lag en fil som heter Sample.js, legg inn koden nedenfor og plasser den i testkatalogen.
describe('Sample test', function() {
it('Condition is true', function() {
expect('AngularJS').toBe('AngularJS');
});
});
Koden ovenfor har fรธlgende aspekter
- Beskriv-funksjonen brukes til รฅ gi en beskrivelse av testen. I vรฅrt tilfelle gir vi beskrivelsen "Sample test" til testen vรฅr.
- 'It'-funksjonen brukes til รฅ gi et navn til testen. I vรฅrt tilfelle oppgir vi navnet pรฅ testen vรฅr som "Betingelsen er sann". Navnet pรฅ testen mรฅ gi mening.
- Kombinasjonen av sรธkeordet 'forvent' og 'toBe' angir hva som er forventet og faktisk verdi av testresultatet. Hvis den faktiske og forventede verdien er den samme, vil testen bestรฅ, ellers mislykkes den.
Nรฅr du kjรธrer fรธlgende linje ved ledeteksten, vil den kjรธre testfilen ovenfor
KARMA start
Utgangen nedenfor er hentet fra IDE Webstorm hvor trinnene ovenfor ble utfรธrt.
- Utgangen kommer i Karma-utforskeren innenfor Webstorm. Dette vinduet viser utfรธrelsen av alle tester som er definert i karma-rammeverket.
- Her kan du se at beskrivelsen av testen som er utfรธrt vises som er "Sample test".
- Deretter kan du se at selve testen som har navnet "Condition is true" er utfรธrt.
- Merk at siden alle tester har det grรธnne "Ok"-ikonet ved siden av som symboliserer at alle tester bestรฅtt.
Tester AngularJS-kontrollere
Karma-testing-rammeverket har ogsรฅ funksjonalitet til รฅ teste kontrollere fra ende til annen. Dette inkluderer testing av $scope-objektet som brukes i kontrollere.
La oss se pรฅ et eksempel pรฅ hvordan vi kan oppnรฅ dette.
I vรฅrt eksempel,
Vi mรฅ fรธrst definere en kontroller. Denne kontrolleren vil utfรธre trinnene nedenfor
- Opprett en ID-variabel og tilordne verdien 5 til den.
- Tilordne ID-variabelen til $scope-objektet.
Testen vรฅr vil teste eksistensen av denne kontrolleren og ogsรฅ teste for รฅ se om ID-variabelen til $scope-objektet er satt til 5.
Fรธrst mรฅ vi sikre at fรธlgende forutsetning er pรฅ plass
Installer Angular.JS-mocks-biblioteket via npm. Dette kan gjรธres ved รฅ utfรธre linjen under i ledeteksten
npm install Angular JS-mocks
Neste er รฅ endre karma.conf.js-filen for รฅ sikre at de riktige filene er inkludert for testen. Segmentet nedenfor viser bare fildelen av karma.conf.js som mรฅ endres
files: ['lib/AngularJS.js','lib/AngularJS-mocks.js','lib/index.js','test/*.js']
- Parameteren 'filer' forteller i utgangspunktet Karma alle filene som kreves for รฅ kjรธre testene.
- Filene AngularJS.js og AngularJS-mocks.js kreves for รฅ kjรธre AngularJS-enhetstester
- index.js-filen kommer til รฅ inneholde vรฅr kode for kontrolleren
- Testmappen kommer til รฅ inneholde alle vรฅre AngularJS-tester
Nedenfor er vรฅr Angular.JS-kode som vil bli lagret som en fil Index.js i testmappen til applikasjonen vรฅr.
Koden nedenfor gjรธr bare fรธlgende ting
- Lag en AngularJS-modul kalt sampleApp
- Lag en kontroller kalt AngularJSController
- Lag en variabel kalt ID, gi den en verdi pรฅ 5 og tilordne den til $scope-objektet
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.controller('AngularJSController', function($scope) {
$scope.ID =5;
});
Nรฅr koden ovenfor er utfรธrt vellykket, vil neste trinn vรฆre รฅ lage en Testsak for รฅ sikre at koden er skrevet og utfรธrt pรฅ riktig mรฅte.
Koden for testen vรฅr vil vรฆre som vist nedenfor.
Koden vil vรฆre i en egen fil kalt ControllerTest.js, som vil bli plassert i testmappen. Koden nedenfor gjรธr bare fรธlgende viktige ting
- beforeEach-funksjon โ Denne funksjonen brukes til รฅ laste vรฅr AngularJS.JS-modul kalt 'sampleApp' fรธr testkjรธringen. Merk at dette er navnet pรฅ modulen i en index.js-fil.
- $controller-objektet er opprettet som et mockup-objekt for kontrolleren "Angular JSController" som er definert i vรฅr index.js-fil. I enhver form for enhetstesting representerer et falskt objekt et dummyobjekt som faktisk vil bli brukt til testingen. Dette falske objektet vil faktisk simulere oppfรธrselen til kontrolleren vรฅr.
- beforeEach(inject(function(_$controller_) โ Dette brukes til รฅ injisere det falske objektet i testen vรฅr slik at det oppfรธrer seg som den faktiske kontrolleren.
- var $omfang = {}; Dette er et falskt objekt som opprettes for $scope-objektet.
- var kontroller = $controller('AngularJSController', { $scope: $scope }); โ Her sjekker vi om det finnes en kontroller kalt 'Angular.JSController'. Her tilordner vi ogsรฅ alle variabler fra $scope-objektet vรฅrt i kontrolleren vรฅr i Index.js-filen til $scope-objektet i testfilen vรฅr
- Til slutt sammenligner vi $scope.ID med 5
describe('AngularJSController', function() {
beforeEach(module('sampleApp'));
var $controller;
beforeEach(inject(function(_$controller_){
$controller = _$controller_;
}));
describe('$scope.ID', function() {
it('Check the scope object', function() {
var $scope = {};
var controller = $controller('AngularJSController', { $scope: $scope });
expect($scope.ID).toEqual(5);
});
});
});
Testen ovenfor vil kjรธre i karma-nettleseren og gi samme bestรฅtt resultat som ble vist i forrige emne.
Testing av AngularJS-direktiver
Karma-testingsrammeverket har ogsรฅ funksjonalitet til รฅ teste tilpassede direktiver. Dette inkluderer templateURL-ene som brukes i tilpassede direktiver.
La oss se pรฅ et eksempel pรฅ hvordan vi kan oppnรฅ dette.
I vรฅrt eksempel vil vi fรธrst definere et tilpasset direktiv som gjรธr fรธlgende
- Lag en AngularJS-modul kalt sampleApp
- Lag et tilpasset direktiv med navnet - Guru99
- Lag en funksjon som returnerer en mal med en header-tag som viser teksten "This is AngularJS Testing."
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.directive('Guru99', function () {
return {
restrict: 'E',
replace: true,
template: '<h1>This is AngularJS Testing</h1>'
};
});
Nรฅr koden ovenfor er utfรธrt vellykket, vil neste trinn vรฆre รฅ lage en testcase for รฅ sikre at koden er skrevet og utfรธrt pรฅ riktig mรฅte. Koden for testen vรฅr vil vรฆre som vist nedenfor
Koden vil vรฆre i en egen fil kalt DirektivTest.js, som vil bli plassert i testmappen. Koden nedenfor gjรธr bare fรธlgende viktige ting
- beforeEach-funksjon โ Denne funksjonen brukes til รฅ laste vรฅr Angular JS-modul kalt 'sampleApp' fรธr testkjรธringen.
- Tjenesten $compile brukes til รฅ kompilere direktivet. Denne tjenesten er obligatorisk og mรฅ deklareres slik at Angular.JS kan bruke den til รฅ kompilere vรฅrt tilpassede direktiv.
- $rootscope er det primรฆre omfanget av enhver AngularJS.JS-applikasjon. Vi har sett $scope-objektet til kontrolleren i tidligere kapitler. Vel, $scope-objektet er det underordnede objektet til $rootscope-objektet. Grunnen til at dette er deklarert her er fordi vi gjรธr en endring til en faktisk HTML-tag i DOM via vรฅrt egendefinerte direktiv. Derfor mรฅ vi bruke $rootscope-tjenesten som faktisk lytter eller vet nรฅr en endring skjer fra et HTML-dokument.
- var element = $compile(โ โ) โ Dette brukes til รฅ sjekke om direktivet vรฅrt blir injisert som det skal. Navnet pรฅ vรฅrt tilpassede direktiv er Guru99, og vi vet fra kapittelet vรฅrt om tilpassede direktiver at nรฅr direktivet injiseres i HTML-en vรฅr, vil det bli injisert som ' '. Derfor brukes denne erklรฆringen for รฅ foreta den kontrollen.
- expect(element.html()).toContain(โThis is AngularJS Testingโ) โ Dette brukes til รฅ instruere expect-funksjonen om at den skal finne elementet (i vรฅrt tilfelle div-taggen) for รฅ inneholde den innerHTML-teksten til โThis is AngularJS-testingโ.
describe('Unit testing directives', function() {
var $compile,
$rootScope;
beforeEach(module('sampleApp'));
beforeEach(inject(function(_$compile_, _$rootScope_){
$compile = _$compile_;
$rootScope = _$rootScope_;
}));
it('Check the directive', function() {
// Compile a piece of HTML containing the directive
var element = $compile("<ng-Guru99></ng-Guru99>")($rootScope);
$rootScope.$digest();
expect(element.html()).toContain("This is AngularJS Testing");
});
});
Testen ovenfor vil kjรธre i karma-nettleseren og gi samme bestรฅtt resultat som ble vist i forrige emne.
End-to-end-testing av AngularJS JS-applikasjoner
Karma-testingsrammeverket sammen med et rammeverk kalt Protractor har funksjonaliteten til รฅ teste en nettapplikasjon fra ende til annen.
Sรฅ det er ikke bare testing av direktiver og kontrollere, men ogsรฅ testing av alt annet som kan vises pรฅ en HTML-side.
La oss se pรฅ et eksempel pรฅ hvordan vi kan oppnรฅ dette.
I vรฅrt eksempel nedenfor skal vi ha en AngularJS-applikasjon som lager en datatabell ved รฅ bruke ng-repeat-direktivet.
- Vi lager fรธrst en variabel kalt "tutorial" og tildeler den noen nรธkkelverdi-par i ett trinn. Hvert nรธkkel-verdi-par vil bli brukt som data nรฅr tabellen vises. Opplรฆringsvariabelen tilordnes deretter scope-objektet slik at det kan nรฅs fra vรฅrt syn.
- For hver rad med data i tabellen bruker vi ng-repeat-direktivet. Dette direktivet gรฅr gjennom hvert nรธkkelverdi-par i opplรฆringsomfangsobjektet ved รฅ bruke variabelen ptutor.
- Til slutt bruker vi tag sammen med nรธkkelverdiparene (ptutor.Name og ptutor.Description) for รฅ vise tabelldataene.
<table >
<tr ng-repeat="ptutor in tutorial">
<td>{{ ptutor.Name }}</td>
<td>{{ ptutor.Description }}</td>
</tr>
</table>
</div>
<script type="text/javascript">
var app = AngularJS.module('DemoApp', []);
app.controller('DemoController', function($scope) {
$scope.tutorial =[
{Name: "Controllers" , Description : "Controllers in action"},
{Name: "Models" , Description : "Models and binding data"},
{Name: "Directives" , Description : "Flexibility of Directives"}
] });
Nรฅr koden ovenfor er utfรธrt vellykket, vil neste trinn vรฆre รฅ lage en testcase for รฅ sikre at koden er skrevet og utfรธrt pรฅ riktig mรฅte. Koden for testen vรฅr vil vรฆre som vist nedenfor
Testen vรฅr skal faktisk teste ng-repeat-direktivet og sikre at den inneholder 3 rader med data, slik den skal fra eksemplet ovenfor.
Fรธrst mรฅ vi sikre at fรธlgende forutsetning er pรฅ plass
Installer vinkelmรฅlerbiblioteket via npm. Dette kan gjรธres ved รฅ utfรธre linjen under i ledeteksten
"npm install protractor"
Koden for testen vรฅr vil vรฆre som vist nedenfor.
Koden vil vรฆre i en egen fil kalt CompleteTest.js , som vil bli plassert i testmappen. Koden nedenfor gjรธr bare fรธlgende viktige ting
- Nettleserfunksjonen leveres av vinkelmรฅlerbiblioteket og forutsetter at vรฅr AngularJS-applikasjon (med koden vist ovenfor) kjรธrer pรฅ nettstedets URL - http://localhost:8080/Guru99/
- var list=element.all(by.repeater(ptutor in tutorial')); -Denne kodelinjen henter faktisk ng-repeat-direktivet som er fylt med koden 'ptutor in tutorial'. Elementet og by.repeater er spesielle nรธkkelord levert av vinkelmรฅlerbiblioteket som lar oss fรฅ detaljer om ng-repeat-direktivet.
- forventer(liste.antall()).toEqual(3); โ Til slutt bruker vi forventningsfunksjonen for รฅ se at vi faktisk fรฅr 3 elementer som fylles ut i tabellen vรฅr som et resultat av ng-repeat-direktivet.
Describe('Unit testing end to end', function() {
beforeEach(function() {
browser.get('http://localhost:8080/Guru99/');
})
it('Check the ng directive', function() {
var list=element.all(by.repeater(ptutor in tutorial'));
expect(list.count()).toEqual(3); }); });
Testen ovenfor vil kjรธre i karma-nettleseren og gi samme bestรฅtt resultat som ble vist i forrige emne.
Sammendrag
- Testing i AngularJS oppnรฅs ved รฅ bruke karma-rammeverket, et rammeverk som er utviklet av Google selv.
- Karma-rammeverket er installert ved hjelp av nodepakkebehandleren. Nรธkkelmodulene som kreves for รฅ bli installert for grunnleggende testing er karma, karma-krom-launcher, karma-jasmin og karma-cli.
- Testene er skrevet i separate js-filer, vanligvis lagret i testmappen til applikasjonen din. Plasseringen av disse testfilene mรฅ nevnes i en spesiell konfigurasjonsfil kalt karma.conf.js. Karma bruker denne konfigurasjonsfilen nรฅr alle tester utfรธres.
- Karma kan ogsรฅ brukes til รฅ teste kontroller og tilpassede direktiver.
- For en ende til ende webtesting, mรฅ et annet rammeverk kalt gradskive installeres via Node, pakkebehandling. Dette rammeverket gir spesielle metoder som kan brukes til รฅ teste alle elementene pรฅ en HTML-side.

