Mit Ember (cli) Wie bekomme ich einen Abnahmetest, um auf ein Versprechen zu warten?

8

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%     
jklina 22.10.2014, 01:03
quelle

4 Antworten

15

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

    
Luke Melia 23.11.2014, 03:28
quelle
10

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,

%Vor%

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:

%Vor%

Hoffe das hilft!

    
Andy Pye 21.11.2014 14:47
quelle
1

Ich kann Ihr Problem nicht in JSBin reproduzieren, aber Sie haben versucht, stop() und start() zu verwenden. In Ihrem Fall:

%Vor%     
saygun 19.11.2014 23:53
quelle
1

Falls Sie auf ein Versprechen warten, das nicht auflöst, sondern ablehnt, finden Sie hier einen Patch, um den Fehler abzufangen und trotzdem den Helfer andThen ember test weiterzuleiten.

%Vor%
    
Gab 04.12.2015 21:40
quelle

Tags und Links