Wie teste ich ein .run in AngularJS?

8
%Vor%

Das ist mein Code, den ich in einer init.js -Datei habe. Wie kann ich dies testen?

    
Shamoon 14.05.2014, 18:53
quelle

5 Antworten

6

Das Testen eines Blocks mit run(..) ist so einfach wie das Laden von module(..) in Jasmine .

Der gesamte folgende Code ist in diesem Plünderer verfügbar.

>

Betrachten Sie die folgende sehr einfache app.js :

%Vor%

Beachten Sie, dass das Markup in dieser App nicht relevant ist.

Betrachten Sie nun den folgenden Test:

%Vor%

Hier ist die Konsolenausgabe:

%Vor%

Beachten Sie, dass der Test bestanden wird

Einige wichtige Beobachtungen

  • Die ersten beiden Konsolenausgaben, (1) und (2) , werden während der normalen Ausführung der App protokolliert.
  • Die Protokollnachrichten (3) bis (5) werden ausgegeben, während der Test ausgeführt wird.

In Anbetracht der obigen Ausführungen können wir folgendes feststellen:

  1. Im Komponententest wurde das Modul 'myapp' instanziiert
  2. Im Komponententest wurde MainCtrl nicht instanziiert
  3. Im Unit-Test wurde der run -Block ausgeführt
  4. Beim Ausführen eines Komponententests wird zuerst der Block beforeEach...run ausgeführt, dann beforeEach und schließlich der Block it .
  5. Die zweite beforeEach ist nicht nützlich für das Unit-Testen eines run Blocks (beachten Sie, dass Sie eine beforeEach einfügen können Blockieren Sie vor beforeEach(module('myapp')); , wenn Sie jedoch versuchen, einen Injektor in diesem Block zu erstellen, wird Ihr Test fehlschlagen.

Und schließlich können wir daraus schließen, dass der oben stehende Code ist, wie Sie einen run -Block testen können. Was Ihren speziellen Test betrifft, wird es mit diesem Wissen möglich sein, eine Einheit zu konstruieren testen Sie mit Dependency Injection Mocking und < a href="https://github.com/pivotal/jasmine/wiki/Spies"> Jasmins toHaveBeenCalled() assertion .

    
Gil Birman 24.05.2014, 05:18
quelle
1

Eine einfache Methode wäre das Speichern eines Authentifizierungsobjekts in $ rootScope. Erwarten Sie in Ihrem Komponententest, dass der Wert leer oder undefiniert ist, füllen Sie dann das Objekt in Ihrem Dienst aus, und führen Sie einen erneuten Test mit dem Wert oder der Länge des Objekts durch.

    
Steve 22.05.2014 18:05
quelle
1

Ich habe das noch nicht getestet, aber ich bin mir ziemlich sicher, dass es so funktioniert. Die app.run -Methode soll ausgeführt werden, sobald das angegebene Modul alle seine Abhängigkeiten geladen hat, aber bevor es irgendwelche Controller initialisiert. In Ihrem Test (vorausgesetzt Sie verwenden Jasmin) rufen Sie diesen Initialisierer auf, indem Sie Folgendes tun:

%Vor%

Dieser Aufruf von module('MyApp') initialisiert das Modul, welches "sollte" (in der Theorie, weil ich es noch nicht getestet habe) sofort danach die run-Methode aufruft. Das bedeutet, dass Sie den Laufblock testen können, indem Sie etwas anderes tun:

%Vor%

Ich bin vielleicht völlig daneben, aber ich glaube, das sollte dich beginnen. Hoffe es hilft.

    
tennisgent 22.05.2014 18:06
quelle
1

Ich hatte ein ähnliches Problem und beschloss, alles in einen Application-Level-Service zu packen. Für mich fühlte es sich etwas unordentlich und schlecht organisiert an - vor allem, wenn alles ordentlich ist und den eckigen Weg geebnet hat. Der Laufblock fühlte sich ein wenig wie eine Müllhalde an.

So, wie wir Zugang zu D.I. Im Gegensatz zum Config-Block können wir einfach unseren gesamten Code in einen Dienst stecken und ihn über eine Init-Methode auslösen.

Anwendungsdienst

%Vor%

Methode ausführen

%Vor%

Unser Application Service kann nun für all die Dinge zuständig sein, die am Anfang der App erledigt werden müssen - es ist nur eine einfache Fabrik, damit wir die Scheiße austesten können - und wir können sie bei Bedarf ergänzen .

Als Nebenbemerkung bevorzuge ich ngmin , um meine angularen Verkleinerungsprobleme zu beheben - führt zu einem saubereren, besser lesbaren Code für die Entwickler.

    
Sten Muchow 23.05.2014 06:15
quelle
1

Du könntest versuchen, deine $rootScope , userService so zu verspotten:

%Vor%

In Ihren Tests könnten Sie Ihre gefälschte authenticated angeben, um 2 Fälle zu testen:

%Vor%

DEMO

    
Khanh TO 24.05.2014 04:04
quelle

Tags und Links