2016-04-15 190 views
1

嗨,我有一個角度服務。如何測試函數是否被調用(單元測試角)

... 

return { 
    setMixpanel: function(searchObject){ 
        searchObject["referrer"] ? mixpanel.register({"$referrer":searchObject["referrer"]}) : mixpanel.register({"$referrer":""}); 

    } 
} 

在我的單元測試,我可能不得不spyOnmixpanelregister一起。但我需要以某種方式模擬mixpanel.register。

如何正確模擬mixpanel.register?代碼去哪裏。

我嘲笑它,如下所示:

var mixpanel={ 
     register : function(object){ 
     return object 
     } 
    }; 

但我在哪裏把這個代碼?這是對的嗎?

我希望有人能幫到我嗎?!

編輯: 測試本身看起來大概是這個樣子

it('should test', function(){ 
    spyOn(mixpanel,'register'); 
    redirectService.setMixpanel(search); 
    expect(mixpanel.register).toHaveBeenCalledWith('...'); 
}) 

但爲了做到這一點我需要模擬mixpanel。如果我只是spyOn混合面板,我會得到一個錯誤。

回答

2

您需要先創建一個spyObject。有沒有必要嘲笑你的服務

beforeEach(function() { 
    myServiceSpy = jasmine.createSpyObj('myService'); 

    module(function ($provide) { 
     $provide.value('myService', myServiceSpy); 
    }); 
}); 

測試

describe("myService", function() { 
    it("calls the getUser() function", function() { 

     /* Maybe this line unnecessary, cant try it atm */ 
     spyOn(service, "getUser"); 
     expect(service.getUser).toHaveBeenCalled(); 
    }); 
}); 

如果你想測試,如果mixpanel.register被調用,您需要創建mixpanel的間諜對象。用$提供你告訴測試使用間諜,而不是真正的服務。

describe('mixPanel', function() { 
    mixPanelSpy = jasmine.createSpyObj('mixPanel'); 

    beforeEach(module(function($provide) { 
    $provide.value("mixpanel", mixPanelSpy); 
    })); 

    beforeEach(inject(function (_mixpanelService_) { 
     mixpanelService = _mixpanelService_; 
    })); 

    it('should set mixpanel', function() { 
     mixpanelService.setMixPanel('test'); 
     expect(mixpanel.register).toBeCalled(); 
    }); 
}); 

寫道,在我心裏,也許是你需要修復

+0

感謝您的評論的一些衝突。我知道我必須在其上創建一個間諜。像這樣的東西。 spyOn(mixpanel, '註冊'); redirectService.setMixpanel(obejct); ('...');預計(mixpanel.register).toHaveBeenCalledWith('...');但是,如果我不首先模擬mixpanel.register,它將不會被識別 – Dribel

+0

欲瞭解更多信息,請通過編輯您的問題來分享您的測試代碼。 – trollr

+0

我編輯我的文章。認爲應該幫助你:) – trollr

相關問題