In meiner Ember-App habe ich derzeit ein Modell mit einer findResults
-Funktion, die ein Versprechen zurückgibt, das eine Google Places-Bibliothek zum Abrufen von Ergebnissen für die automatische Vervollständigung verwendet. Um dies in meiner Benutzeroberfläche zu verwenden, habe ich einen PromiseMixin-Controller eingerichtet. Ich weise den Controller an, den searchText
-Wert zu beobachten, und wenn sich das ändert, aktualisiere ich den Versprechenswert des Controllers als das Versprechen, das von der findResults
-Funktion zurückgegeben wird, aber mit dem neuen Wert von searchText
. Das funktioniert gut, wenn ich mit der App im Browser spiele, aber wenn ich meine Akzeptanztests durchführe, scheint der Test beendet zu sein, bevor das Versprechen zurückgegeben wird und daher die Tests fehlschlagen. Ich werde die relevanten Dateien unten einfügen.
Ich bin mir nicht sicher, wie ich Ember sagen soll, dass er auf das Versprechen warten soll, während des Tests zu lösen.
app / services / google-autocomplete-location.js
%Vor%app / controllers / index.js
%Vor%Tests / Akzeptanz / create-new-entry-test.js
%Vor%Der beste Weg, dies zu tun, ist wahrscheinlich, Ihren eigenen asynchronen Testhelfer zu registrieren. Ich habe einen JSBin mit einer Simulation Ihres Codes und einer Lösung hier vorbereitet: Ссылка
Der Code zum Erstellen des Helpers lautet:
%Vor%Und es würde so verwendet werden:
%Vor%Beim Ember-Testing wartet ein Async-Helfer automatisch auf vorherige Versprechen und nachfolgende asynchrone Helfer warten darauf, wenn der Test ausgeführt wird. Für einen hervorragenden Hintergrund hierzu siehe Cory Forsyths Entmystifizieren von asynchronen Tests
Ich bin neu in diesem Zeug und habe heute ähnliche Schwierigkeiten gehabt. Ich habe festgestellt, dass andThen
nur auf Versprechungen wartet, die mit Ember-Test-Versprechungen erstellt wurden,
und nicht diejenigen, bei denen das Versprechen direkt instanziiert wird, d.h.
%Vor% Ember.Test.promise
gibt new Ember.RSVP.Promise
zurück, macht aber auch den Schritt, in dem Ember.Test.lastPromise
auf die Verheißungsinstanz gesetzt wird, bevor es zurückgegeben wird. Vielleicht ist die Antwort hier, dass Sie Ember.Test.lastPromise
auf das Versprechen setzen, auf das Sie warten?
Übrigens musste ich in meinem Fall stop()
und start()
verwenden, um zu verhindern, dass der Test beendet wurde, bevor der zweite Assert aufgerufen wurde. Ich musste auch die zweite Behauptung in einen run.next
Aufruf einwickeln, um den Eigenschaften / DOM eine Möglichkeit zu geben, zu aktualisieren:
Hoffe das hilft!
Tags und Links javascript ember.js