Ich versuche, einen Dienst zu testen, der asynchrone Methoden hat, aber kein Glück haben.Unit testet einen asynchronen Dienst in angularjs
Ich habe versucht, mit Versprechen zu implementieren, indem Sie die $ q Unterstützung in angularjs verwenden.
Jede Hilfe wäre willkommen.
angular.module('myapp', ['myservice']);
angular.module('myservice', []).factory('myservice', function($q) {
var ls = {};
ls.DoIt = function() {
var deferred = $q.defer();
setTimeout(function(){
deferred.resolve(5);
},3000);
return deferred.promise;
}
return ls;
});
describe('services', function() {
beforeEach(module('myservice'));
it("should equal 2", inject(function(myservice) {
myservice.DoIt().then(function(returned) {
expect(returned).toEqual(2);
});
}));
});
Danke für die detaillierte Erklärung. Der Dienst, den ich schreibe, verwendet IndexedDB und die API ist asynchron und ich habe Schwierigkeiten, wie ich das oben Angeführte anwenden kann, wenn die DoIt-Funktion etwas wie request.onsuccess = function (event) rufen würde { // Tun Sie etwas mit request.result ! deferred.resolve (Ergebnis); }; – user1405779
@Pawel Was passiert, wenn ich einen Controller teste, der 'DoIt'-Mock-Service verwendet, und' DoIt' in diesem Controller in einer Schleife ist, so wird er mehrmals aufgerufen. Wie spüle ich es mehrmals? Ist es nicht möglich, 'DoIt' zu aktivieren? Ich habe versucht, einen asynchronen Spott zu bekommen, um sich selbst zu leeren, indem ich [this] (http://jsfiddle.net/cUEQ8/) darin einfüge, aber das scheint nicht sehr robust zu sein. –
Eigentlich scheint die Geige, die ich oben geteilt habe, erfolgreich einen Spott zu bekommen. Das Problem, das ich festgestellt habe, war woanders ... –