2016-05-08 4 views
0

Я хочу, чтобы модуль тестировал функцию, которая вызывается несколько раз на основе ответа от другой функции.Функция Jasmine Unit Test Promise, которая называется несколько раз на основе ответа от другой функции обещания

Как и на мой вопрос: Call a promise function multiple times until condition met from another promise function.

Вот функция

var monitorProgress = function() { 
    return getActiveTasks().then(function(res) { 
     if(res.length > 0) { 
      progress = res[0].progress; 
      if(progress !== 100){ 
       return $timeout(function(){ 
        return monitorProgress(); // multiple calls 
       },1000); 
      } 
      else { 
       // exit 
       console.log("done"); 
      } 
     } 
     else{ 
      console.log("done"); 
     } 

    }); 
}; 

ответ

0

Вот как я тестировал эту функцию:

describe('monitorProgress function', function() { 
    var response = null; 
    var promise = null; 
    var progress = 0; 
    beforeEach(function() { 

     // fake the implementation of monitorProgress 
     spyOn(SyncService,'monitorProgress').and.callFake(function() { 

      progress++; 

      // this mimics getActiveTasks promise and 
      // returns a promise with a res array length > 0 
      var deferred = $q.defer(); 
      var res = [{ progress : progress }]; 
      deferred.resolve(res); 

      // here the promise is returns 
      return deferred.promise.then(function(res) { 
       console.log("getActiveTasks res: " + JSON.stringify(res,null,2)) 
       if(res.length > 0) { 
        progress = res[0].progress; 
        if(progress !== 100){ 
         // keeps calling this until progress === 100 
         return SyncService.monitorProgress(); 
        } 
        else { 
         // exit 
         console.log("exiting"); 
        } 
       } 
       else { 
        // we never go here 
       } 
      }); 
     }); 

     // now that the spy is set, call the function 
     promise = SyncService.monitorProgress(); 
    }) 

    it("tracks that monitorProgress was called", function() { 
     expect(SyncService.monitorProgress).toHaveBeenCalled(); 
    }); 

    it("tracks that monitorProgress returned a promise", function() { 
     expect(promise).toBeDefined(); 
    }); 

    it("should return when progress is 100", function() { 
     // very important step 
     $rootScope.$apply(); 

     // the final expectation 
     expect(progress).toBe(100); 
    }); 
});