scope. $ watch nicht in Anweisung beim Komponententest aufgerufen

9

Problem

Ich teste eine Richtlinie. Die Direktive überwacht eine Bereichsvariable, aber die Uhr wird nie aufgerufen. Den $watch -Aufruf direkt in den Unit-Test zu setzen funktioniert. Warum wird das $watch in der Direktive nicht aufgerufen?

Danke!

Details

Hier ist mein Originaltest. Die Direktive hat eine Uhr drin und schaut auf 'reEvalCreateDate' . Es wird nie aufgerufen und die Datumszeichenfolge ist immer leer.

Test ohne watch-Anweisung darin

%Vor%

Als Test stecke ich die Uhr in den Komponententest. Es wird korrekt aufgerufen und der Test wird bestanden.

Source (modifiziert, um die Uhr in den Test selbst zu setzen)

%Vor%

Direktiven-Quellcode

Hier ist der Anweisungscode mit der Anweisung watch.

%Vor%

Setup-Code

Hier ist der Init-Code für den Test.

%Vor%

Aktualisieren

Ich bin der Meinung, dass ich nicht den Anwendungsbereich der Richtlinie festlege. Ich sehe in der API nichts, was mir erlaubt, das zu tun. Ich habe mehrere Permutationen des Aufrufs $compile ausprobiert und versucht, den Gültigkeitsbereich darauf festzulegen:

Erstellen Sie ein Element aus HTML, übergeben Sie es zum Kompilieren. Kein Glück.

%Vor%

und indem Sie zuerst ein Element erstellen

%Vor%

Wenn das Problem darin besteht, dass ich den Bereich nicht auf die Direktive setze, wäre der Fehler wahrscheinlich in meinem beforeEach , denke ich. Hier ist es:

%Vor%     
John Gordon 30.01.2013, 20:47
quelle

2 Antworten

3

Ich bin gerade auf ein ähnliches Problem gestoßen, als ich eine Direktive mit isolate scope getestet habe.

Der Grund, warum es nicht aufgerufen wurde, ist, dass $digest "alle Beobachter des aktuellen Bereichs und seiner untergeordneten Elemente verarbeitet" () Ссылка . $ RootScope.Scope). Nun würden Sie denken, dass die bidirektional gebundenen Variablen einer Direktive (definiert mit "=") den Umfang des Tests beobachten würden, aber ich fand, dass mein $watch nicht aufgerufen wurde. Ist das ein Fehler in eckigen?

Meine Lösung bestand darin, den gesamten Testcode nach dem scope.$digest() in ein $timeout zu verpacken, z. B.

%Vor%

Bearbeiten: Siehe auch Unit testet eine AngularJS-Direktive, die ein Attribut mit Isolate-Bereich überwacht

    
alalonde 29.08.2013 17:07
quelle
1

Ich habe erlebt, was wie das selbe Problem aussieht. In meinem Fall hatte meine Anweisung eine templateUrl statt einer hartcodierten template , also musste ich in meinem Unit-Test auch eine verspottete HTTP-Anfrage durch Aufruf von:

einrichten %Vor%

Alles andere sah genauso aus wie in Ihrem Beispiel und meine Uhr wurde nicht angerufen.

Dann erinnerte ich mich, wenn Sie $httpBackend verwenden, um die Anfrage zu verspotten, müssen Sie $httpBackend.flush() like so aufrufen:

%Vor%

Sobald der Flush-Call ausgelöst wurde, wurde meine Uhr angerufen.

Hoffe, das hilft ...

Jason

    
Jason Capriotti 13.02.2013 17:43
quelle