Próbuję przetestować usługę, która ma asynchroniczne metody, ale nie mam szczęścia.Jednostka testująca usługę asynchroniczną w angularjs
Próbowałem wdrożyć za pomocą obietnic za pomocą wsparcia $ q w angularjs.
Każda pomoc zostanie doceniona.
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);
});
}));
});
Dzięki za szczegółowe wyjaśnienie. Usługa, którą piszę używa IndexedDB i api jest asynchroniczna i walczę o to, w jaki sposób mogę zastosować powyższe, gdy funkcja DoIt nazywa coś w stylu request.onsuccess = function (event) { // Zrób coś za pomocą request.result ! deferred.resolve (wynik); }; – user1405779
@Pawel Co jeśli testuję kontroler korzystający z usługi "Do It", a wewnątrz kontrolera, 'DoIt' jest w pętli, więc jest wywoływany wiele razy. Jak mogę spłukać to wiele razy? Czy nie można uzyskać polecenia "Do It", aby samo się przepłukać? Próbowałem uzyskać asynchroniczną próbę, aby przepłukać się, włączając w to [this] (http://jsfiddle.net/cUEQ8/), ale to nie wydaje się bardzo solidne. –
Właściwie to skrzypce, które udostępniłem powyżej, wydają się skutecznie udawać, że się spłukują. Problem okazał się być gdzieś innym ... –