Jestem całkiem nowy w Angular i pracuję nad przetestowaniem usługi Angular, która uruchamia usługę poziomu API, która owija wiązkę wywołań do usługi REST. Ponieważ działa z żądaniami HTTP, obie części usługi działają z obietnicami i wydaje się, że działają dobrze, ale mam problemy z uzyskaniem jakichkolwiek testów obiecanego działania.Test jaśminowy dla usługi Angular nie rozwiązuje odroczonego połączenia
Odpowiednia część mojego kodu serwisowego (rażące uproszczony) wygląda następująco:
angular.module('my.info')
.service('myInfoService', function (infoApi, $q) {
infoLoaded: false,
allInfo: [],
getInfo: function() {
var defer = $q.defer();
if (infoLoaded) {
defer.resolve(allInfo);
} else {
infoApi.getAllInfo().then(function (newInfo) {
allInfo = newInfo;
infoLoaded = true;
defer.resolve(allInfo);
});
}
return defer.promise;
}
});
Kiedy jestem skonfigurowaniu makiety mam coś takiego:
describe("Info Service ",
function() {
var infoService, infoRequestApi, $q;
beforeEach(module("my.info"));
beforeEach(function() {
module(function($provide) {
infoRequestApi = {
requestCount: 0,
getAllInfo: function() {
var defer = $q.defer();
this.requestCount++;
defer.resolve([ "info 1", "info 2" ]);
return defer.promise;
}
};
$provide.value("infoApi", infoRequestApi);
});
inject(function(_myInfoService_, _$q_) {
infoService = _myInfoService_,
$q = _$q_;
});
});
it("should not fail in the middle of a test", function(done) {
infoService.getInfo().then(function(infoResult) {
// expectation checks.
expect(true).toBeTrue();
}).finally(done);
});
});
Wszelkie badania synchroniczne przechodzą W porządku, ale kiedy próbuję uruchomić takie testy, otrzymuję komunikat: Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
Wygląda to tak, jakby coś o sposobie, w jaki Angular.Moc ks obsłuży odroczony wynik powodując jego niepowodzenie. Kiedy przechodzę test, zmienna próbna obiektu defer
jest ustawiana poprawnie, ale instrukcja then
w usłudze nigdy nie jest wywoływana. Gdzie się mylę?
Dziękuję podwójnie, zarówno za dobrą odpowiedź, jak i sugestie dotyczące refaktoryzacji. Podejrzewałem, że kpiące podejście jest trochę rozwlekłe! Jedyny problem, jaki mam teraz, to to, że wygląda na to, że jeśli mam kilka warstw usługowych, wygląda na to, że muszę wstrzyknąć próbkę każdemu konstruktorowi od samego początku, ale jest to znacznie bardziej przejrzyste i bardziej idiomatyczne. – glenatron
@glenatron Bez problemu. Trzeba tylko kpić z zależności używanych w testowanej usłudze. Nie trzeba kpić z ich zależności, więc kwestia warstw jest dyskusyjna. –
Masz rację, faktycznie miałem problem z programem testującym Chutzpah dla Visual Studio, który powodował fałszywe niepowodzenia. Te same testy sprawdzają się w przypadku innych biegaczy testowych. – glenatron