如何测试函数是否被调用(单位测试角度)

时间:2016-04-15 11:50:17

标签: angularjs unit-testing mocking jasmine

嗨,我有一个有角度的服务。

...

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

    }
}

在我的单元测试中,我可能需要spyOn mixpanelregister。但我需要以某种方式模拟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,我会收到一个错误。

1 个答案:

答案 0 :(得分: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();
   });
});

在我的脑海中写道,也许你需要解决一些冲突