Прежде всего, setTimeout
особенно сложно тестировать, так как трудно издеваться. К счастью, у AngularJS есть обертка вокруг него ($timeout
), играющая ту же роль, но ее можно легко высмеивать:
ls.DoIt = function() {
var deferred = $q.defer();
$timeout(function(){
deferred.resolve(5);
},3000);
return deferred.promise;
}
Макет, предоставленный для $timeout
, позволяет нам легко имитировать прошедшее время (с $timeout.flush()
), что означает, что наши тесты могут выполняться быстро, не ожидая завершения события async (обратите внимание, что производственный код по-прежнему использует асинхронный API!).
Измененные тесты выглядят так:
it("should equal 5", inject(function(myservice, $timeout) {
var valueToVerify;
myservice.DoIt().then(function(returned) {
valueToVerify = returned;
});
$timeout.flush();
expect(valueToVerify).toEqual(5);
}));
И, наконец, рабочий jsFiddle: http://jsfiddle.net/v9L9G/1/