2013-03-24 57 views
14

我有一個簡單的服務,我試圖進行單元測試。無論我嘗試什麼,searchService都是一個未知的提供者,或者服務是空的(奇怪的是,這不會導致我的測試失敗!!)。使用Jasmine測試簡單的AngularJS服務

任何人都知道我可能會做錯什麼?

angular.module('app').service('searchService', function($q, _) { // _ is lodash 

    var cache = [ 
    { 
     id: "current", 
     name: "Current", 
     description: "Search current data" 
    }, 
    { 
     id: "historical", 
     name: "Historical", 
     description: "Search historical data" 
    } 
    ]; 

    this.getSearchOptions = function() { 
    var deferred = $q.defer(); 
    deferred.resolve(angular.copy(cache)); 
    return(deferred.promise); 
    }; 

    this.getSearchOptionsByID = function(id) { 
    var deferred = $q.defer(); 
    var searchOption = _.findWithProperty(cache, "id", id); 

    if (searchOption) { 
     deferred.resolve(angular.copy(searchOption)); 
    } else { 
     deferred.reject(); 
    } 
    return(deferred.promise); 
    }; 
    } 
); 

我想創建一個單元測試,在searchService負荷,所以我可以檢查緩存值:

describe("Unit: Testing Services", function() { 
    describe("Search Service:", function() { 
    var service = null; 

    beforeEach(function() { 
     angular.module('app').service('_'); 
    }); 
    // I've also tried the commented out code below 
    //beforeEach(inject(function(searchService) { 
    //this.service = searchService; 
    //})); 
    //it('should contain an searchService', invoke(function(service) { 

    it('should contain an searchService', function(searchService) { 
     expect(searchService).not.to.equal(null); 
    }); 

    it('should contain two search options', function(searchService) { 
     expect(searchService.getSearchOptions()).to.equal(2); 
    }); 
    }); 
}); 

回答

21

下應無參數的服務工作,也許這可能是一個起點:

describe("Unit: Testing Services", function() { 
    describe("Search Service:", function() { 

     beforeEach(function() { 
      angular.module('app'); 
     }); 

     it('should contain a searchService', 
      inject(function(searchService) { 
       expect(searchService).not.to.equal(null); 
     })); 

     it('should contain two search options', 
      inject(function(searchService) { 
       expect(searchService.getSearchOptions()).to.equal(2); 
     })); 

    }); 
}); 

(您也可以看看這裏:How do I test an AngularJS service with Jasmine?

+1

它得到了我正朝着正確的方向前進。謝謝!我放棄了angular.module('app'),只是做了模塊('app')。然後改變注入(這是遲到了,猜測我的手指有自己的想法) – nathasm 2013-03-25 02:08:12

+5

很高興聽到。作爲一個方面說明,實際上module('app')是angular.mock.module('app')的一個快捷方式,它允許你創建真實模塊的模擬。 – Flolagale 2013-03-25 12:47:06

相關問題