So erstellen Sie Unit-Tests für Array-Funktionen in AngularJS mit Jasmine

8

Ich habe xf array: var xf = []; Und ich habe eine Funktion ist ein Element in diesem Array und eine Funktion, um es zu verwenden:

%Vor%

Aber wenn ich meine Spezifikation starte:

%Vor%

Es macht einen Fehler:

  

xf.validateUsername ist keine Funktion

Wie kann ich es abdecken?

    
Pham Minh Tan 31.07.2015, 10:14
quelle

4 Antworten

1

Die Variable xf kann nicht außerhalb des Bereichs des Controllers aufgerufen werden (d. h. in den Unit-Testdateien nicht verfügbar).

Sie müssen Folgendes getan haben:

%Vor%

Sie könnten die Variable xf an die MyController-Instanz anhängen, sobald Angular sie instanziiert:

%Vor%

Aber das ist nicht wirklich eine saubere Art, es zu tun. Ein besserer Weg (meiner Meinung nach) wäre, eine Fabrik zu schaffen:

%Vor%

Jetzt können Sie die Fabrik in Ihren Controller injizieren, um xf:

zu verwenden %Vor%

Schließlich wird es für die Komponententests sehr einfach, die Methode validateEmail zu testen.

%Vor%

Sie müssen die Datei angular-mocks der Karma-Konfiguration hinzufügen.

Danke an Paul Podlech und Claies für die Hinweise in den Kommentaren / Antworten.

    
Brunt 08.08.2015 23:54
quelle
0

Ich bin mir nicht sicher, ob du deine Frage vollständig verstanden hast. Aber es gibt ein paar Leute, die denken, dass du falsch liegst:

  • Wenn es sich bei xf um eine globale Variable handelt, sollten Sie sich darüber lustig machen, da Sie den Controller testen und nicht die globale Variable.
  • Wenn Sie die tatsächliche Funktion Ihrer globalen Variablen überprüfen möchten, gehen Sie zur Datei karma.conf.js und fügen Sie den Pfad js-Datei zur Option files hinzu:

    files: [ ..., 'fx-script.js', ... ],

  • callThrough sollte verwendet werden, bevor die eigentliche Funktion aufgerufen wird:

    it ('checkEmail', function(){ var ctrl = $controller('MyCtrl', { $scope: $scope }); spyOn(window, ctrl.xf.validateUsername).and.callThrough(); ctrl.xf.validateUsername(); });

Ich empfehle Ihnen, Ihre controller , service oder globale Skripte separat zu testen und Mocks hinzuzufügen, wenn Sie eine Abhängigkeit oder eine globale Variable injizieren wollen. Wenn Sie also sicher sagen können, welche module / script versagt jederzeit.

    
Matho 03.08.2015 04:46
quelle
0

Sie sollten die Funktionalität in xf in separaten Service / Factory verschieben. Dann injizieren Sie es in den Controller. Das macht es ziemlich einfach, es beim Testen zu verspotten.

    
srjt 07.08.2015 06:11
quelle
0

Versuchen Sie dies in der Steuerung

%Vor%

und das in deinem Test

%Vor%

Aber Sie sollten wissen, dass dies Ihr xf-Objekt auf dem Controller verfügbar macht, wie im Kommentar von Claies .

    
Paul Georg Podlech 07.08.2015 11:42
quelle