2016-04-01 69 views
1

我有對userService依賴它來自不同的模塊茉莉花和AngularJS - 單元測試嘲笑依賴

我試圖寫一個單元測試,檢查userService的性質的AuthService我已經嘲笑並且在我的測試規範中包含使用$ provide服務。

beforeEach(function() { 
    module('app.services'); 
    //Need to provide userService since it lives in a different module 
    module(function ($provide) { 
     $provide.value('userService', function(){ 
      return { 
       userLoggedIn: false 
      } 
     }); 
    }); 
}); 

//Question - will injecting _userService_ pick up the mocked instance from above? 
beforeEach(inject(function(_AuthService_, _userService_) { 
    authService = _AuthService_; 
    userService = _userService_; 
})); 

describe('some text', function() { 
    it('should make a get request to check the users token', function() { 
     $httpBackend.expectGET('/auth/checktoken').respond({}); 
     authService.hasAccessToken(); 
     $httpBackend.flush(); 
    }); 
    it('should set userService.userLoggedIn to be true', function() { 
     expect(userService.userLoggedIn).toBeTruthy(); 
    }); 
}); 

我對我的用戶服務的期望失敗,因爲它回來爲未定義。我需要做什麼才能測試我的嘲笑userService

感謝

UPDATE

確定這樣的基礎上的意見,我可以得到它通過組織我的測試中,像這樣

describe('hasAccessToken', function() { 
    beforeEach(function(){ 
     authService.hasAccessToken(); 
    }); 
    it('should make a get request to catalogues', function() { 
     $httpBackend.expectGET('/auth/checktoken').respond({}); 
     $httpBackend.flush(); 
    }); 
    it('should set userService.userLoggedIn to be true', function() { 
     $httpBackend.expectGET('/auth/checktoken').respond({}); 
     $httpBackend.flush(); 
     expect(userService.userLoggedIn).toBeTruthy(); 
    }); 
    }); 

通過正如你可以看到我正在努力分別爲expectGET和userService編寫測試,這是正確的嗎?只是似乎很詳細?

+0

是注入authService的行爲足以將userLoggedIn設置爲true,還是缺少呼叫?類似於authService.login(user); –

+0

對不起,我更新了我的代碼片段,因此有一個早期測試調用'authService.hasAccessToken()'將'userService.userLoggedIn'設置爲true – mindparse

+0

beforeEach方法在每次測試之前運行,並且如您所知重置userService的狀態。您可以將調用hasAccessToken放入beforeEach方法,或者根據您的喜好在每個測試中調用它。 –

回答

0

您正在爲供應商使用角度爲value的合成糖,但是您提供了一個構造函數,該函數應該與service語法一起使用。

嘗試使用該服務的構造與service語法instaed:

beforeEach(module(function ($provide) { 
    $provide.service('userService', function(){ 
     return { 
      userLoggedIn: false 
     } 
    }); 
}); 

或只使用該服務的實例與value語法:

beforeEach(module(function ($provide) { 
    $provide.value('userService', { 
      userLoggedIn: false 
     } 
    }); 
}); 

見角文檔:$provide