如何模拟 Google 分析函数调用 ga()
How to mock Google Analytics function call ga()
我有一个服务 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: Can't find variable: ga
问题是 ga
的全局范围。
您在测试中创建的 ga
变量具有本地作用域,并且对您自己的服务不可见。
使用全局变量 (ga
) 使单元测试变得困难。
当前的选择是创建一个 angular 服务来包装 ga
并在其他任何地方使用它。这样的服务也可以嘲笑
另一个选项是覆盖全局 ga
。但是这样会有副作用。
window.ga=function() {}
有点过时了,但我正在尝试利用 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,这将很有帮助。
在尝试了不同的解决方案后,我终于用下面的代码修复了。
beforeAll( ()=> {
// (<any>window).gtag=function() {} // if using gtag
(<any>window).ga=function() {}
})
我有一个服务 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: Can't find variable: ga
问题是 ga
的全局范围。
您在测试中创建的 ga
变量具有本地作用域,并且对您自己的服务不可见。
使用全局变量 (ga
) 使单元测试变得困难。
当前的选择是创建一个 angular 服务来包装 ga
并在其他任何地方使用它。这样的服务也可以嘲笑
另一个选项是覆盖全局 ga
。但是这样会有副作用。
window.ga=function() {}
有点过时了,但我正在尝试利用 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,这将很有帮助。
在尝试了不同的解决方案后,我终于用下面的代码修复了。
beforeAll( ()=> {
// (<any>window).gtag=function() {} // if using gtag
(<any>window).ga=function() {}
})