(Hier gibt es eine verwandte Frage: Der Jasmin-Test sieht kein AngularJS-Modul. )
Ich möchte nur einen Dienst testen, ohne Angular zu booten.
Ich habe mir einige Beispiele und das Tutorial angesehen, aber ich gehe nirgendwo hin.
Ich habe nur drei Dateien:
myService.js: Hier definiere ich einen AngularJS-Dienst
test_myService.js: Hier definiere ich einen Jasmin-Test für den Service.
specRunner.html: Eine HTML-Datei mit der normalen Jasmin-Konfiguration, in die ich die beiden vorherigen Dateien und die Dateien Jasmine, Angularjs und angle-mocks.js importiere.
Dies ist der Code für den Dienst (der wie erwartet funktioniert, wenn ich nicht teste):
var myModule = angular.module('myModule', []);
myModule.factory('myService', function(){
var serviceImplementation = {};
serviceImplementation.one = 1;
serviceImplementation.two = 2;
serviceImplementation.three = 3;
return serviceImplementation
});
Da ich versuche, den Dienst isoliert zu testen, sollte ich in der Lage sein, darauf zuzugreifen und ihre Methoden zu überprüfen. Meine Frage ist: Wie kann ich den Dienst in meinen Test einfügen, ohne AngularJS zu booten?
Wie kann ich beispielsweise den für eine Methode des Dienstes mit Jasmine zurückgegebenen Wert wie folgt testen:
describe('myService test', function(){
describe('when I call myService.one', function(){
it('returns 1', function(){
myModule = angular.module('myModule');
//something is missing here..
expect( myService.one ).toEqual(1);
})
})
});
beforeEach
den Fall zu integrieren, dass viele ... viele ... viele Tests für den Service erforderlich sind? Testen eines Datenmodells (Dienstes) und es enthält eine Menge globaler Variablen. Vielen Dank, C§Während die obige Antwort wahrscheinlich gut funktioniert (ich habe es nicht ausprobiert :)), muss ich oft viel mehr Tests ausführen, damit ich selbst keine Tests einspritze. Ich werde es () Fälle in Beschreibungsblöcke gruppieren und meine Injektion in einem beforeEach () oder beforeAll () in jedem Beschreibungsblock ausführen.
Robert hat auch insofern Recht, als er sagt, dass Sie den Angular $ -Injektor verwenden müssen, um die Tests auf den Service oder die Fabrik aufmerksam zu machen. Angular verwendet diesen Injektor selbst auch in Ihren Anwendungen, um der Anwendung mitzuteilen, was verfügbar ist. Es kann jedoch an mehr als einer Stelle aufgerufen werden, und es kann auch implizit statt explizit aufgerufen werden. Sie werden feststellen, dass in meiner Beispielspezifikationstestdatei unten der Block beforeEach () implizit den Injektor aufruft , um Dinge zur Verfügung zu stellen, die innerhalb der Tests zugewiesen werden können.
Zurück zum Gruppieren von Dingen und Verwenden von Vorblöcken, hier ein kleines Beispiel. Ich mache einen Cat-Service und möchte ihn testen. Daher würde meine einfache Einrichtung zum Schreiben und Testen des Service folgendermaßen aussehen:
app.js.
Spezifikation: Cats Controller
Spezifikation: Cats Service
BEARBEITEN Basierend auf einigen Kommentaren habe ich meine Antwort etwas komplexer aktualisiert und mir auch einen Plunkr ausgedacht, der Unit-Tests demonstriert. In einem der Kommentare wurde insbesondere erwähnt: "Was ist, wenn der Dienst eines Controllers selbst eine einfache Abhängigkeit aufweist, z. B. $ log?" - was im Beispiel mit Testfällen enthalten ist. Ich hoffe es hilft! Teste oder hacke den Planeten !!!
https://embed.plnkr.co/aSPHnr/
quelle
Ich musste eine Direktive testen, für die eine andere Direktive erforderlich war, Google Places Autocomplete . Ich überlegte , ob ich sie nur verspotten sollte. Trotzdem funktionierte dies ohne Fehler für die Direktive, für die gPlacesAutocomplete erforderlich war.
quelle
Wenn Sie einen Controller testen möchten, können Sie ihn wie folgt injizieren und testen.
quelle