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

Don*_*uwe 3 unit-testing google-analytics google-analytics-api jasmine angularjs

我有一个服务MyService,其功能使用ga()要测试的事件跟踪调用:

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

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

    return {
        myFunc: myFunc
    }
]);
Run Code Online (Sandbox Code Playgroud)

我的规格文件如下所示:

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
    });
});
Run Code Online (Sandbox Code Playgroud)

运行测试始终可以为我提供:

ReferenceError:找不到变量:ga

Cha*_*ani 5

问题是的全球范围ga

ga您在测试内部创建的变量具有局部作用域,并且对您自己的服务不可见。

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

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

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

window.ga=function() {}


Sha*_*got 5

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

beforeAll( ()=> {
    // (<any>window).gtag=function() {} // if using gtag
    (<any>window).ga=function() {}
})
Run Code Online (Sandbox Code Playgroud)