2016-04-15 191 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

相关问题