AngularJS Unit Testing: Karma Jasmine Tutorial
En af de mest geniale funktioner ved Angular.JS er Test aspekt. Da udviklerne hos Google udviklede AngularJS, blev de ved med at teste og sรธrgede for, at hele AngularJS-frameworket var testbart.
I AngularJS udfรธres test normalt ved hjรฆlp af Karma (ramme). Angular JS-test kan udfรธres uden Karma, men Karma-rammevรฆrket har en sรฅ genial funktionalitet til at teste AngularJS-kode, at det giver mening at bruge denne ramme.
- I AngularJS kan vi optrรฆde Enhedstest separat for controllere og direktiver.
- Vi kan ogsรฅ udfรธre end of end-test af AngularJS, som er test fra et brugerperspektiv.
Introduktion og installation af Karma framework
Karma er en test automatiseringsvรฆrktรธj oprettet af Angular JS-teamet hos Google. Det fรธrste trin for at bruge Karma er at installere Karma. Karma installeres via npm (som er en pakkehรฅndtering, der bruges til nem installation af moduler pรฅ en lokal maskine).
Installation af Karma
Installationen af โโKarma via npm sker i en to-trins proces.
Trin 1) Udfรธr nedenstรฅende linje fra kommandolinjen
npm install karma karma-chrome-launcher karma-jasmine
hvori,
- npm er kommandolinjevรฆrktรธjet til node-pakkehรฅndteringen, der bruges til at installere brugerdefinerede moduler pรฅ enhver maskine.
- Installationsparameteren instruerer kommandolinjevรฆrktรธjet npm om, at installation er pรฅkrรฆvet.
- Der er angivet 3 biblioteker i kommandolinjen, som er nรธdvendige for at arbejde med karma.
- karma er kernebiblioteket, som vil blive brugt til testformรฅl.
- karma-chrome-launcher er et separat bibliotek, som gรธr det muligt at genkende karma-kommandoer af chrome-browseren.
- karma-jasmin โ Dette installerer jasmin, som er en afhรฆngig ramme for karma.
Trin 2) Det nรฆste trin er at installere kommandolinjevรฆrktรธjet karma. Dette er nรธdvendigt for at udfรธre karma-linjekommandoer. Karmalinjevรฆrktรธjet vil blive brugt til at initialisere karmamiljรธet til test.
For at installere kommandolinjevรฆrktรธjet skal du udfรธre nedenstรฅende linje fra kommandolinjen
npm install karma-cli
hvori,
Konfiguration af Karma-rammen
Det nรฆste trin er at konfigurere karma, som kan udfรธres via kommandoen
"karma โinit"
Efter at ovenstรฅende trin er udfรธrt, vil karma oprette en karma.conf.js-fil. Filen vil sandsynligvis se ud som uddraget vist nedenfor
files: [ 'Your application Name'/AngularJS/AngularJS.js', 'Your application Name'/AngularJS-mocks/AngularJS-mocks.js', 'lib/app.js', 'tests/*.js' ]
Ovenstรฅende konfigurationsfiler fortรฆller karma runtime-motoren fรธlgende ting
- 'Dit applikationsnavn' โ Dette vil blive erstattet af navnet pรฅ din ansรธgning.
- 'Dit applikationsnavn'/AngularJS/AngularJS.js' โ Dette fortรฆller karma, at din applikation afhรฆnger af kernemodulerne i AngularJS
- 'Dit applikationsnavn'/AngularJS-mocks/AngularJS-mocks.js' โ Dette fortรฆller karma at bruge Unit Testing-funktionaliteten til AngularJS fra Angular.JS-mocks.js-filen.
- Alle hovedapplikations- eller forretningslogikfilerne er til stede i lib-mappen i din applikation.
- Testmappen vil indeholde alle enhedstestene.
For at kontrollere, om karma virker, skal du oprette en fil kaldet Sample.js, indsรฆtte nedenstรฅende kode og placere den i testmappen.
describe('Sample test', function() {
it('Condition is true', function() {
expect('AngularJS').toBe('AngularJS');
});
});
Ovenstรฅende kode har fรธlgende aspekter
- Beskriv-funktionen bruges til at give en beskrivelse af testen. I vores tilfรฆlde giver vi beskrivelsen 'Sample test' til vores test.
- 'it'-funktionen bruges til at give et navn til testen. I vores tilfรฆlde angiver vi navnet pรฅ vores test som 'Betingelsen er sand'. Navnet pรฅ testen skal give mening.
- Kombinationen af โโsรธgeordet 'forvent' og 'toBe' angiver, hvad der er den forventede og faktiske vรฆrdi af testresultatet. Hvis den faktiske og forventede vรฆrdi er den samme, vil testen bestรฅ, ellers mislykkes den.
Nรฅr du udfรธrer fรธlgende linje ved kommandoprompten, vil den udfรธre ovenstรฅende testfil
KARMA start
Nedenstรฅende output er taget fra IDE Webstorm hvor ovenstรฅende trin blev udfรธrt.
- Outputtet kommer i Karma explorer indeni Webstorm. Dette vindue viser udfรธrelsen af โโalle test, som er defineret i karma-rammen.
- Her kan du se, at beskrivelsen af โโden udfรธrte test vises, som er "Sample test".
- Dernรฆst kan du se, at selve testen, som har navnet "Condition is true", er udfรธrt.
- Bemรฆrk, at da alle tests har det grรธnne "Ok"-ikon ved siden af, hvilket symboliserer, at alle tests bestรฅet.
Test af AngularJS-controllere
Karma-testrammen har ogsรฅ funktionaliteten til at teste controllere fra ende til anden. Dette inkluderer test af $scope-objektet, som bruges i controllere.
Lad os se pรฅ et eksempel pรฅ, hvordan vi kan opnรฅ dette.
I vores eksempel,
Vi skal fรธrst definere en controller. Denne controller ville udfรธre de nedenstรฅende trin
- Opret en ID-variabel og tildel vรฆrdien 5 til den.
- Tildel ID-variablen til $scope-objektet.
Vores test vil teste eksistensen af โโdenne controller og ogsรฅ teste for at se, om ID-variablen for $scope-objektet er sat til 5.
Fรธrst skal vi sikre, at fรธlgende forudsรฆtning er pรฅ plads
Installer Angular.JS-mocks biblioteket via npm. Dette kan gรธres ved at udfรธre nedenstรฅende linje i kommandoprompten
npm install Angular JS-mocks
Det nรฆste er at รฆndre filen karma.conf.js for at sikre, at de rigtige filer er inkluderet til testen. Nedenstรฅende segment viser blot fildelen af โโkarma.conf.js, som skal รฆndres
files: ['lib/AngularJS.js','lib/AngularJS-mocks.js','lib/index.js','test/*.js']
- Parameteren 'filer' fortรฆller grundlรฆggende Karma alle de filer, der krรฆves til afviklingen af โโtestene.
- Filen AngularJS.js og AngularJS-mocks.js er pรฅkrรฆvet for at kรธre AngularJS-enhedstests
- Filen index.js kommer til at indeholde vores kode til controlleren
- Testmappen kommer til at indeholde alle vores AngularJS-tests
Nedenfor er vores Angular.JS-kode, som vil blive gemt som en fil Index.js i testmappen i vores applikation.
Nedenstรฅende kode gรธr bare fรธlgende ting
- Opret en AngularJS modul kaldet sampleApp
- Opret en controller kaldet AngularJSController
- Opret en variabel kaldet ID, giv den en vรฆrdi pรฅ 5 og tildel den til $scope-objektet
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.controller('AngularJSController', function($scope) {
$scope.ID =5;
});
Nรฅr ovenstรฅende kode er eksekveret med succes, ville nรฆste trin vรฆre at oprette en Test sag for at sikre, at koden er skrevet og udfรธrt korrekt.
Koden til vores test vil vรฆre som vist nedenfor.
Koden vil vรฆre i en separat fil kaldet ControllerTest.js, som vil blive placeret i testmappen. Nedenstรฅende kode gรธr blot fรธlgende vigtige ting
- beforeEach funktion โ Denne funktion bruges til at indlรฆse vores AngularJS.JS modul kaldet 'sampleApp' fรธr testkรธrslen. Bemรฆrk, at dette er navnet pรฅ modulet i en index.js-fil.
- $controller objektet er oprettet som et mockup objekt for controlleren "Angular JSController", som er defineret i vores index.js fil. I enhver form for enhedstest reprรฆsenterer et falsk objekt et dummy-objekt, som faktisk vil blive brugt til testen. Dette falske objekt vil faktisk simulere vores controllers opfรธrsel.
- beforeEach(inject(function(_$controller_) โ Dette bruges til at injicere det falske objekt i vores test, sรฅ det opfรธrer sig som den faktiske controller.
- var $omfang = {}; Dette er et falsk objekt, der oprettes for $scope objektet.
- var controller = $controller('AngularJSController', { $scope: $scope }); โ Her tjekker vi for eksistensen af โโen controller ved navn 'Angular.JSController'. Her tildeler vi ogsรฅ alle variabler fra vores $scope-objekt i vores controller i Index.js-filen til $scope-objektet i vores testfil
- Til sidst 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);
});
});
});
Ovenstรฅende test vil kรธre i karma-browseren og give det samme bestรฅelsesresultat, som blev vist i det forrige emne.
Test af AngularJS-direktiver
Karma-testrammen har ogsรฅ funktionaliteten til at teste brugerdefinerede direktiver. Dette inkluderer templateURL'erne, som bruges i brugerdefinerede direktiver.
Lad os se pรฅ et eksempel pรฅ, hvordan vi kan opnรฅ dette.
I vores eksempel vil vi fรธrst definere et brugerdefineret direktiv, som gรธr fรธlgende
- Opret et AngularJS-modul kaldet sampleApp
- Opret et brugerdefineret direktiv med navnet - Guru99
- Opret en funktion, der returnerer en skabelon med et header-tag, der 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 ovenstรฅende kode er eksekveret med succes, ville nรฆste trin vรฆre at oprette en testcase for at sikre, at koden er skrevet og udfรธrt korrekt. Koden til vores test vil vรฆre som vist nedenfor
Koden vil vรฆre i en separat fil kaldet DirektivTest.js, som vil blive placeret i testmappen. Nedenstรฅende kode gรธr blot fรธlgende vigtige ting
- beforeEach funktion โ Denne funktion bruges til at indlรฆse vores Angular JS-modul kaldet 'sampleApp' fรธr testkรธrslen.
- Tjenesten $compile bruges til at kompilere direktivet. Denne service er obligatorisk og skal deklareres, sรฅ Angular.JS kan bruge den til at kompilere vores brugerdefinerede direktiv.
- $rootscope er det primรฆre omfang af enhver AngularJS.JS-applikation. Vi har set $scope-objektet for controlleren i tidligere kapitler. Nรฅ, $scope-objektet er det underordnede objekt af $rootscope-objektet. Grunden til, at dette erklรฆres her, er, at vi foretager en รฆndring af et faktisk HTML-tag i DOM via vores brugerdefinerede direktiv. Derfor er vi nรธdt til at bruge $rootscope-tjenesten, som faktisk lytter eller ved, hvornรฅr en รฆndring sker inde fra et HTML-dokument.
- var element = $compile(โ โ) โ Dette bruges til at kontrollere, om vores direktiv bliver injiceret som det skal. Navnet pรฅ vores brugerdefinerede direktiv er Guru99, og vi ved fra vores brugerdefinerede direktivkapitel, at nรฅr direktivet injiceres i vores HTML, vil det blive injiceret som ' '. Derfor bruges denne erklรฆring til at foretage denne kontrol.
- expect(element.html()).toContain(โThis is AngularJS Testingโ) โ Dette bruges til at instruere expect-funktionen om, at den skal finde elementet (i vores tilfรฆlde div-tagget) til at indeholde den indreHTML-tekst af โThis is AngularJS-testningโ.
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");
});
});
Ovenstรฅende test vil kรธre i karma-browseren og give det samme bestรฅelsesresultat, som blev vist i det forrige emne.
End to End-testning af AngularJS JS-applikationer
Karma-testrammerne sammen med en ramme kaldet Protractor har funktionaliteten til at teste en webapplikation fra ende til anden.
Sรฅ det er ikke kun test af direktiver og controllere, men ogsรฅ test af alt andet, som kan dukke op pรฅ en HTML-side.
Lad os se pรฅ et eksempel pรฅ, hvordan vi kan opnรฅ dette.
I vores eksempel nedenfor vil vi have en AngularJS-applikation, som opretter en datatabel ved hjรฆlp af ng-repeat-direktivet.
- Vi opretter fรธrst en variabel kaldet "tutorial" og tildeler den nogle nรธglevรฆrdi-par i รฉt trin. Hvert nรธgle-vรฆrdi-par vil blive brugt som data, nรฅr tabellen vises. Selvstudievariablen tildeles derefter scope-objektet, sรฅ det kan tilgรฅs fra vores visning.
- For hver rรฆkke af data i tabellen bruger vi ng-repeat-direktivet. Dette direktiv gennemgรฅr hvert nรธglevรฆrdi-par i selvstudiets scope-objekt ved at bruge variablen ptutor.
- Endelig bruger vi tag sammen med nรธglevรฆrdiparrene (ptutor.Name og ptutor.Description) for at vise tabeldataene.
<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 ovenstรฅende kode er eksekveret med succes, ville nรฆste trin vรฆre at oprette en testcase for at sikre, at koden er skrevet og udfรธrt korrekt. Koden til vores test vil vรฆre som vist nedenfor
Vores test vil faktisk teste ng-repeat-direktivet og sikre, at det indeholder 3 rรฆkker af data, som det skal fra ovenstรฅende eksempel.
Fรธrst skal vi sikre, at fรธlgende forudsรฆtning er pรฅ plads
Installer vinkelmรฅlerbiblioteket via npm. Dette kan gรธres ved at udfรธre nedenstรฅende linje i kommandoprompten
"npm install protractor"
Koden til vores test vil vรฆre som vist nedenfor.
Koden vil vรฆre i en separat fil kaldet CompleteTest.js , som vil blive placeret i testmappen. Nedenstรฅende kode gรธr blot fรธlgende vigtige ting
- Browserfunktionen leveres af vinkelmรฅlerbiblioteket og antager, at vores AngularJS-applikation (med koden vist ovenfor) kรธrer pรฅ vores websteds URL - http://localhost:8080/Guru99/
- var list=element.all(by.repeater(ptutor i tutorial')); -Denne kodelinje henter faktisk ng-repeat-direktivet, som er udfyldt af koden 'ptutor in tutorial'. Elementet og by.repeater er specielle sรธgeord leveret af vinkelmรฅlerbiblioteket, der giver os mulighed for at fรฅ detaljer om ng-repeat-direktivet.
- forventer(liste.antal()).tilLige(3); โ Til sidst bruger vi forventningsfunktionen til at se, at vi faktisk fรฅr 3 elementer udfyldt i vores tabel som fรธlge af 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); }); });
Ovenstรฅende test vil kรธre i karma-browseren og give det samme bestรฅelsesresultat, som blev vist i det forrige emne.
Resumรฉ
- Test i AngularJS opnรฅs ved at bruge karma frameworket, et framework som er udviklet af Google selv.
- Karma-rammen installeres ved hjรฆlp af node-pakkehรฅndteringen. Nรธglemodulerne, der skal installeres til grundlรฆggende test, er karma, karma-chrome-launcher, karma-jasmin og karma-cli.
- Testene er skrevet i separate js-filer, som normalt opbevares i testmappen i din applikation. Placeringen af โโdisse testfiler skal nรฆvnes i en speciel konfigurationsfil kaldet karma.conf.js. Karma bruger denne konfigurationsfil, nรฅr alle tests udfรธres.
- Karma kan ogsรฅ bruges til at teste controllere og brugerdefinerede direktiver.
- For en ende til ende webtest skal en anden ramme kaldet vinkelmรฅler installeres via Node, pakkehรฅndtering. Denne ramme giver specielle metoder, som kan bruges til at teste alle elementerne pรฅ en HTML-side.

