【问题标题】:How to mock Google Analytics function call ga()如何模拟谷歌分析函数调用 ga()
【发布时间】:2016-08-16 02:34:34
【问题描述】:

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

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

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

    return {
        myFunc: myFunc
    }
]);

我的规范文件如下所示:

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

【问题讨论】:

  • 如果你想测试一个服务,你不应该使用 Protractor。 Protractor 旨在开发和运行端到端测试,在浏览器中从用户的角度测试整个应用程序。
  • 抱歉,我当然是在谈论单元测试 - 更改了我的文字
  • ga 是在函数内部定义的,不是全局的。试试 window.ga = function() {}

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


【解决方案1】:

问题是ga 的全局范围。

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

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

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

另一个选项是覆盖全局ga。但这会有副作用。

window.ga=function() {}

【讨论】:

  • 谢谢,有没有办法以某种方式监视或拦截全局变量?
  • 你可以试试spyOn(window, 'ga');
  • 同样适用于dataLayerwindow.dataLayer = { push: function() {} }
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    有点过时了,但我正在尝试利用 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,这将很有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-22
      • 2017-05-08
      相关资源
      最近更新 更多