Integrationstests mit Jasmine Frame Work und AngularJS

Üblicherweise nutzt man für Unit Tests mit Jasmine das "$httpBackend" von AngularJS, um Ergebnisse zu simulieren (Mock).

Möchte man Ausnahmsweise einen richtigen Request stellen, muss man sich vom Angular Injector direkt das wirkliche "$http" Objekt geben lassen, um diese Tests durchzuführen.

Einige Anmerkungen zu dem Beispiel:

Für AngularJS Tests, kann man sich vor jedem Test die Globale Variablen, mittels Code Injection zuweisen lassen:

beforeEach(inject(function ($http, $rootScope) {

Der Trick, um beim Test nicht den Mock, sondern den wirklichen $http zu holen, geht indem man sich es direkt vom echten Injector holt:

http = angular.injector(["ng"]).get("$http");

Der "Get" ist eine Aynchrone Methode, die nicht sofort aufgeführt wird, da sich dahinter ja ein AJAX Request verbirgt.

Durch Übergabe von "done()" kann man JASMINE mitteilen, wann die It() Funktion tatsächlich erledigt ist:


it("Retrieve the data from http", function (done) { http.get("http://services.odata.org/").then(function (data) { expect(true).toBe(true); done(); }, function (data) { expect(true).toBe(false); done(); }); rootScope.$apply(); });

Damit die Get Methode tatsächlich ausgeführt wird, ist das über $rootScope noch entsprechend anzuschieben:

rootScope.$apply();