Angularjs 如何测试函数是否被调用(单元测试)

Angularjs 如何测试函数是否被调用(单元测试),angularjs,unit-testing,mocking,jasmine,Angularjs,Unit Testing,Mocking,Jasmine,嗨,我有一个角度服务 ... return { setMixpanel: function(searchObject){ searchObject["referrer"] ? mixpanel.register({"$referrer":searchObject["referrer"]}) : mixpanel.register({"$referrer":""}); } } 在我的单元测试中,我可能需要spyOnmixpanel以及reg

嗨,我有一个角度服务

...

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

    }
}
在我的单元测试中,我可能需要
spyOn
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 mixpanel,我会得到一个错误

您需要先创建一个间谍对象。没有必要嘲笑你的服务

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

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

如果要测试是否调用了
mixpanel.register
,则需要创建mixpanel的间谍对象。使用$provide,您可以告诉测试使用间谍而不是真正的服务

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,'register');redirectService.setMixpanel(obejct);期望(mixpanel.register).havebeencalledwith(“…”);但是,如果我不模拟mixpanel.register first,它将不会被识别。有关更多信息,请通过编辑您的问题共享您的测试代码。再次感谢。问题在于mixpanel.register不是我的服务的函数,而是在我的服务函数中调用的函数。在您的代码示例中,实际上应该模拟service.getuser,对吗?@user3383709您还需要模拟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();
   });
});