如何模拟Google Analytics函数调用ga()

时间:2016-04-22 12:44:11

标签: angularjs unit-testing google-analytics jasmine google-analytics-api

我有一个服务 MyService ,其中包含一个使用我要测试的ga()事件跟踪调用的函数:

angular.module('myModule').factory('MyService', [function() {

    var myFunc = function() {
        ga('send', 'event', 'bla');
        // do some stuff
    }

    return {
        myFunc: myFunc
    }
]);

我的spec文件如下所示:

describe('The MyService', function () {

    var MyService,
        ga;

    beforeEach(function () {
        module('myModule');
        ga = function() {};
    });

    beforeEach(inject(function (_MyService_) {
        MyService = _MyService_;
    }));

    it('should do some stuff', function () {
        MyService.myFunc();
        // testing function
    });
});

运行我的测试总是给我:

  

ReferenceError:找不到变量:ga

3 个答案:

答案 0 :(得分:4)

问题是ga的全球范围。

您在测试中创建的ga变量具有本地范围,并且对您自己的服务不可见。

通过使用全局变量(ga),您已经使单元测试变得困难。

当前选项是创建一个角度服务来包装ga并在其他地方使用它。这样的服务也可以被嘲笑。

另一种选择是覆盖全局ga。但这会产生副作用。

window.ga=function() {}

答案 1 :(得分:0)

稍有过时,但我试图利用ReactGA并模拟创建一个事件,如:

it('should do something...', () => {
    const gaSpy = jest.spyOn(ReactGA, 'ga');
    someService.functionThatSendsEvent({ ...necessaryParams });
    expect(gaSpy).toHaveBeenCalledWith('send', 'event',
       expect.objectContaining({/*whatever the event object is supposed to be*/}
    );
});

如果您将特定数据发送到angular / reactjs服务,然后再将其发送到GA,这将很有帮助。

答案 2 :(得分:0)

尝试了不同的解决方案后,我终于用下面的代码修复了。

beforeAll( ()=> {
    // (<any>window).gtag=function() {} // if using gtag
    (<any>window).ga=function() {}
})