2014-11-13 61 views
0

我有一個服務:承諾在Restangular服務單元測試不能解決

angular.module('driveby').factory('BuildingsService', function(Restangular) { 
    var buildings = []; 

    var fetchBuildings = function() { 
     return Restangular.all('buildings').getList(); 
    }; 

    var getBuildings = function() { 
     return buildings; 
    }; 

    return { 
     getBuildings: getBuildings, 
     fetchBuildings: fetchBuildings 
    }; 
}); 

我試圖單元測試這種使用茉莉花,但承諾從未解析:

describe('BuildingsService', function() { 
    var BuildingsService, httpBackend; 
    var buildingsUrl = '/api/buildings'; 
    var mockBuildings = [ 
     {id: 1}, 
     {id: 2}, 
     {id: 3} 
    ]; 

    beforeEach(module('driveby')); 

    beforeEach(inject(function($httpBackend) { 
     httpBackend = $httpBackend; 
     httpBackend.whenGET(buildingsUrl).respond(
      JSON.stringify(mockBuildings) 
     ); 
    })); 

    beforeEach(inject(function(_BuildingsService_) { 
     BuildingsService = _BuildingsService_; 
    })); 

    afterEach(function() { 
     httpBackend.verifyNoOutstandingExpectation(); 
     httpBackend.verifyNoOutstandingRequest(); 
    }); 

    it('can fetch the list of buildings from the API', function() { 
     expect(BuildingsService.getBuildings().length).toEqual(0); 

     httpBackend.expectGET(buildingsUrl); 

     BuildingsService.fetchBuildings().then(function(buildings) { 
      expect(buildings.length).toEqual(3); 
     }); 

     httpBackend.flush(); 

     expect(BuildingsService.getBuildings().length).toEqual(3); 
    }); 
}); 

的問題是這條線從未在測試中執行:

expect(buildings.length).toEqual(3); 

API路由是正確的,並且沒有突出的r equests,但httpFlush並沒有解決Restangular的承諾。這條線應該通過,但它返回0而不是3:

expect(BuildingsService.getBuildings().length).toEqual(3); 

有人看到這裏有什麼問題嗎?

回答

0

期望promise回調內部不起作用。測試承諾的正確方法是將返回的值分配給承諾範圍之外的變量。

您的第二個期望是返回0,因爲您的服務的fetchBuildings()不會將buildings數組設置爲API調用的結果;它只是返回。您應該將該賦值添加到您的函數中,或者在測試中創建一個賦予API調用返回值的變量,然後使用expect();檢查該變量。