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!
Hier ist mein Originaltest. Die Direktive hat eine Uhr drin und schaut auf 'reEvalCreateDate'
. Es wird nie aufgerufen und die Datumszeichenfolge ist immer leer.
Als Test stecke ich die Uhr in den Komponententest. Es wird korrekt aufgerufen und der Test wird bestanden.
Hier ist der Anweisungscode mit der Anweisung watch.
%Vor%Hier ist der Init-Code für den Test.
%Vor% 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:
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.
Bearbeiten: Siehe auch Unit testet eine AngularJS-Direktive, die ein Attribut mit Isolate-Bereich überwacht
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:
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:
Sobald der Flush-Call ausgelöst wurde, wurde meine Uhr angerufen.
Hoffe, das hilft ...
Jason
Tags und Links angularjs unit-testing angularjs-directive