2

我有一個服務爲MyService與使用ga()事件跟蹤調用一個函數,我想測試:如何嘲笑谷歌Analytics(分析)函數調用GA()

angular.module('myModule').factory('MyService', [function() { 

    var myFunc = function() { 
     ga('send', 'event', 'bla'); 
     // do some stuff 
    } 

    return { 
     myFunc: myFunc 
    } 
]); 

我的規格文件看起來像這樣:

describe('The MyService', function() { 

    var MyService, 
     ga; 

    beforeEach(function() { 
     module('myModule'); 
     ga = function() {}; 
    }); 

    beforeEach(inject(function (_MyService_) { 
     MyService = _MyService_; 
    })); 

    it('should do some stuff', function() { 
     MyService.myFunc(); 
     // testing function 
    }); 
}); 

運行我的測試中總是給我:

ReferenceError: Can't find variable: ga

+0

如果你想測試一個服務,你不應該使用量角器。量角器是爲開發和運行*端到端測試*而設計的,從用戶的角度在瀏覽器中作爲一個整體來測試您的應用程序。 – alecxe

+0

對不起,我當然在談論單元測試 - 改變了我的文字 – DonJuwe

+1

ga是在函數裏面定義的,不是全局的。嘗試與window.ga =功能(){} – fantarama

回答

4

問題是ga的全球範圍。

您在測試中創建的ga變量具有本地範圍,並且對您自己的服務不可見。

通過使用全局變量(ga),您已使單元測試變得困難。

當前選項將創建角度服務來包裝ga並在其他地方使用該服務。這種服務也可能被嘲笑。其他選項是覆蓋全局ga。但這會產生副作用。

window.ga=function() {}

+0

謝謝,有沒有辦法窺探或截取全球變種? – DonJuwe

+1

你可以試試'spyOn(window,'ga');' – Chandermani

+0

same for dataLayer'window.dataLayer = { push:function(){} } – joshy