2014-02-22 93 views
5

我有,而「初始化」從localStorage的加載數據的AngularJS服務(即在工廠函數),就像這樣:測試AngularJS服務初始化

module.service('myService', function ($localStorage) { 
    var data = $localStorage.data; 
    if (!isValid(data)) // isValid omitted on purpose, not relevant. 
     data = undefined; 

    return { 
     getData: function() { 
     return data; 
     } 
     setData: function(value) { 
     if (isValid(value)) 
      data = value; 
     } 
    }; 
} 

在我的測試,我想檢查data實際上是從localStorage加載的,如果該值存在並且有效;這是關於測試isValid的而不是,但是使用它的服務初始化和$ localStorage。

我希望能夠在我的測試中調用myService工廠。我在beforeEach鉤子中獲得了一個初始化的實例,因爲我需要測試myService的方法。我想我需要爲我的特定初始化測試創建一個不同的實例,但由於服務在AngularJS中是單例,我不確定這是否可以完成。

describe('myService', function() { 
    myService = $localStorage = null; 

    beforeEach(module('app')); 

    beforeEach(inject(function($injector) { 
    myService = $injector.get('myService'); 
    $localStorage = $injector.get('$localStorage'); 
    }); 

    it('should look for stuff in localStorage on creation', function() { 
    $localStorage.data = 'my data'; 
    // I'd like to call service factory here!! 
    myService.getData().should.equal('my data'); 
    }); 
}); 

這可以實現嗎?我的代碼是否有難以測試的結構,還是我不尊重「角度方式」,這應該以不同的方式完成?

回答

3

試試這個:

describe('myService', function() { 
    myService = $localStorage = null; 

    beforeEach(module('app')); 

    beforeEach(inject(function($injector) { 
    $localStorage = $injector.get('$localStorage'); 
    $localStorage.data = 'my data'; 
    myService = $injector.get('myService'); 
    }); 

    it('should look for stuff in localStorage on creation', function() { 
    myService.getData().should.equal('my data'); 
    }); 
});