Wie zu beheben verspricht in AngularJS, Jasmine 2.0, wenn es kein $scope zu zwingen, ein digest?
Scheint es, dass verspricht nicht auflösen in Eckig/Jasmine-tests, es sei denn, Sie erzwingen, dass ein $scope.$digest()
. Das ist dumm IMO aber in Ordnung, ich habe, dass die Arbeit gegebenenfalls (Controller).
Die situation ich bin in nun ist, ich habe einen service, der könnte weniger Pflege über alle Bereiche in der Anwendung, alle es tut, wieder einige Daten aus dem server, aber das Versprechen scheint sich nicht zu lösen.
app.service('myService', function($q) {
return {
getSomething: function() {
var deferred = $q.defer();
deferred.resolve('test');
return deferred.promise;
}
}
});
describe('Method: getSomething', function() {
//In this case the expect()s are never executed
it('should get something', function(done) {
var promise = myService.getSomething();
promise.then(function(resp) {
expect(resp).toBe('test');
expect(1).toEqual(2);
});
done();
});
//This throws an error because done() is never called.
//Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
it('should get something', function(done) {
var promise = myService.getSomething();
promise.then(function(resp) {
expect(resp).toBe('test');
expect(1).toEqual(2);
done();
});
});
});
Was ist der richtige Weg, um das testen dieser Funktionalität?
Edit: Lösung für die Referenz. Anscheinend sind Sie gezwungen zu injizieren und zu verdauen den $rootScope, auch wenn der Dienst nicht verwenden.
it('should get something', function($rootScope, done) {
var promise = myService.getSomething();
promise.then(function(resp) {
expect(resp).toBe('test');
});
$rootScope.$digest();
done();
});
Ich habe ein ng-service mit zwei Funktionen, die Rückgabewerte andere $q verspricht. Jasmin, ich könnte nicht erhalten, der test für die Funktion zu arbeiten, mit der Sie Ihre Vorschläge. Ich habe Jasmin timeout-Fehler. Meine .dann(cb) - Prozedur in meinem test war das aufrufen der Jasmin-done-handler, wie gezeigt, auf der Konsole Nachrichten rund gemacht call. Einzige, was funktionierte war $digest() in der service selbst nach dem beheben. Aber um Dinge zu machen, seltsamer, die zweite service-Funktion bekam eine ng Fehlermeldung, dass die "digest wurde bereits ausgeführt". Also kommentierte ich das digest aus und alles ist gut, aber keine Ahnung warum. Nun, das ist albern.
done
Aufruf am Ende des Tests nicht sinnvoll. Der test ist nicht wirklich asynchron an dieser Stelle. Es sollte aufgerufen werden, am Ende .then
anonyme Funktion. Und bei den Versprechen ist wirklich asynchronen sich anstelle von aufrufen digest einmal am Ende sollte es so etwas wie setInterval($rootScope.$digest, 100)
InformationsquelleAutor Terry | 2014-06-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie injizieren
$rootScope
in der test-und trigger -$digest
.Naja, das problem ist, dass die derzeitige Umsetzung der Versprechen, die gebunden ist, um die digest-Zyklus (eigentlich ist es ein nicht-triviales problem, da wir nicht ein äquivalent des
nextTick
Methode in einem browser). Also ich hab ja Angst, dass es Ihre einzige option ist, solange die Ausbreitung der Verheißung Ergebnisse ist gebunden an die $digest-Zyklus in AngularJS.Ich habe versucht, bin jetzt aber immer eine "Nicht mehr verlangen erwartet, dass' - Fehler.
Ich habe ein Problem, um Daten vom controller kannst du bitte schauen Sie hinein. Können Sie mir helfen, es. stackoverflow.com/questions/53629138/...
InformationsquelleAutor pkozlowski.opensource
es ist immer das $rootScope, verwenden Sie es
Hallo, ich weiß, das ist alt, aber ich habe gerade aktualisiert AngularJS 1.7.2 und dieser nicht mehr funktioniert. Ich bekomme die Fehlermeldung: Fehler: Unerwartete Anfrage: GET /api/auth/params error-Eigenschaften: Objekt({ $$passToExceptionHandler: true })
InformationsquelleAutor mpm
So, ich habe zu kämpfen mit diesem ganzen Nachmittag. Nach der Lektüre dieses post, ich habe auch das Gefühl, dass es etwas mit der Antwort;es stellt sich heraus, es ist. Keine der oben genannten Antworten geben eine klare Erklärung, wo und warum
$rootScope.$digest
. So, hier ist was ich kam mit.First off, warum? Sie benötigen
$rootScope.$digest
Wann immer Sie reagieren, die von einem nicht-Winkel-event oder callback. Dies würde auch den reinen DOM-Ereignisse, jQuery events und andere 3rd-party-Versprechen, die anderen Bibliotheken als$q
ist Teil eckig.Zweitens, wo? In Ihrem code, NICHT der test. Es gibt keine Notwendigkeit, Spritzen
$rootScope
in Ihrem test, ist es nur erforderlich, die in Ihrer tatsächlichen Winkel-Dienst. Das ist, wo alle der oben genannten nicht klar, was die Antwort ist, Sie zeigen$rootScope.$digest
als der Aufruf von test.Ich hoffe das hilft die nächste person, kommt eine lange hat, ist dasselbe Problem.
Update
Lösch ich diesen post gestern, wenn es wurde gewählt. Heute habe ich weiterhin dieses problem haben, versuchen, die Antworten, freundlicherweise zur Verfügung gestellt oben. So, ich standby meine Antwort auf Kosten der reputation-Punkte, und als solche , ich bin gelöschten.
Dies ist, was Sie brauchen, in event-Handlern, die sind nicht eckig, und Sie sind mithilfe von $q und versuchen zu testen mit Jasmine.
$timeout
laufen$apply
, also ich glaube nicht, dass Sie brauchen, um zu verwenden$rootScope.$apply
innerhalb der$timeout
. Probieren Sie es einfach:$timeout(function(){ deferred.resolve(); });
N. B.: ich bin der Hoffnung, dies wird Ihnen helfen @Jeffrey A. Gochin, nicht empfehlen dieses als Lösung für die OPWeißt du was, nach dem spielen mit diesem für eine Weile, ich erkannte, dass das eigentliche problem ist Kantig ist, in diesem Fall. Die Umsetzung der mocks für $timeout gibt, was dieses Problem verursacht. Meine eigenen Tests habe ich beschlossen, einfach meine eigene Testumgebung im browser. Ohne angular-mocks. Wenn ich dies Tue, verschwindet das problem. Das problem ist jetzt, wie man noch automatisieren Sie das testen.
Als ein Nachtrag zu dieser. Ich habe begonnen, mit Winkelmesser und Selen zu automatisieren meine Testumgebung.
InformationsquelleAutor Jeffrey A. Gochin
Aus der angular-Dokumentation.
https://docs.angularjs.org/api/ng/service/$q
InformationsquelleAutor Rentering.com