如何测试函数是否被调用(单元测试角)
问题描述:
嗨,我有一个角度服务。如何测试函数是否被调用(单元测试角)
...
return {
setMixpanel: function(searchObject){
searchObject["referrer"] ? mixpanel.register({"$referrer":searchObject["referrer"]}) : mixpanel.register({"$referrer":""});
}
}
在我的单元测试,我可能不得不spyOn
mixpanel
与register
一起。但我需要以某种方式模拟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混合面板,我会得到一个错误。
答
您需要先创建一个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();
});
});
写道,在我心里,也许是你需要修复
感谢您的评论的一些冲突。我知道我必须在其上创建一个间谍。像这样的东西。 spyOn(mixpanel, '注册'); redirectService.setMixpanel(obejct); ('...');预计(mixpanel.register).toHaveBeenCalledWith('...');但是,如果我不首先模拟mixpanel.register,它将不会被识别 – Dribel
欲了解更多信息,请通过编辑您的问题来分享您的测试代码。 – trollr
我编辑我的文章。认为应该帮助你:) – trollr