【问题标题】:how to test if function was called (unit test angular)如何测试函数是否被调用(单元测试角度)
【发布时间】:2016-08-07 09:09:52
【问题描述】:

您好,我有一个角度服务。

...

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,我会得到一个错误。

【问题讨论】:

    标签: angularjs unit-testing mocking jasmine


    【解决方案1】:

    您需要先创建一个 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创建一个spy对象。使用 $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,'注册');重定向服务.setMixpanel(对象);期望(mixpanel.register).toHaveBeenCalledWith('...');但是如果我不先模拟 mixpanel.register 它将不会被识别
    • 欲了解更多信息,请通过编辑您的问题分享您的测试代码
    • 再次感谢。问题是 mixpanel.register 不是我的服务的功能,而只是我的服务功能中调用的功能。在您的代码示例中,实际上应该模拟 service.getuser 对吗?
    • @user3383709 你还需要模拟 mixpanel 吗?
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 2019-11-20
    • 2021-11-12
    • 2018-06-25
    • 2021-07-20
    相关资源
    最近更新 更多