Javascript 用Jasmine有效地模拟全局属性
我的应用程序依赖于gapi javascript客户端()和jsapi() 我使用AngularJS构建我的应用程序,并使用Karma(以前是TestCular)作为测试运行者 我设法有效地模仿他们,将他们载入业力,然后监视一些方法:Javascript 用Jasmine有效地模拟全局属性,javascript,angularjs,google-api,jasmine,google-api-js-client,Javascript,Angularjs,Google Api,Jasmine,Google Api Js Client,我的应用程序依赖于gapi javascript客户端()和jsapi() 我使用AngularJS构建我的应用程序,并使用Karma(以前是TestCular)作为测试运行者 我设法有效地模仿他们,将他们载入业力,然后监视一些方法: it('should call gapi on share', inject(function (config, doc) { config.appId = 'testAppId'; var shareClientMock = {
it('should call gapi on share', inject(function (config, doc) {
config.appId = 'testAppId';
var shareClientMock = {
setItemIds: jasmine.createSpy('setItemIds'),
showSettingsDialog: jasmine.createSpy('showSettingsDialog')
};
spyOn(gapi.drive.share, 'ShareClient').andReturn(shareClientMock);
scope.share();
expect(gapi.drive.share.ShareClient).toHaveBeenCalledWith(config.appId);
expect(shareClientMock.setItemIds).toHaveBeenCalledWith([doc.info.id]);
expect(shareClientMock.showSettingsDialog).toHaveBeenCalled();
}));
我想用茉莉花来嘲弄他们,但我能想出办法。
我尝试在每个之前创建一个存根:
beforeEach(function () { window.gapi = {...} });
但它仍然没有定义
谢谢您的帮助。我想您应该使用injector获取$window提供程序,然后您可以将模拟添加到该对象中
beforeEach(inject(function($injector){
window = $injector.get('$window');
window.gapi = {...};
});
我认为您需要使用注入器获取$window提供程序,然后可以将模拟添加到该对象
beforeEach(inject(function($injector){
window = $injector.get('$window');
window.gapi = {...};
});
将@SpoBo的评论作为答案,因为它解决了我的问题:
beforeEach(() => {
angular.mock.module('moduleName', $provide => {
$provide.decorator('$window', $delegate => {
$delegate.gapi = {
auth2: {
getAuthInstance: null,
},
// ... or whatever else you need to mock
};
return $delegate;
});
});
});
将@SpoBo的评论作为答案,因为它解决了我的问题:
beforeEach(() => {
angular.mock.module('moduleName', $provide => {
$provide.decorator('$window', $delegate => {
$delegate.gapi = {
auth2: {
getAuthInstance: null,
},
// ... or whatever else you need to mock
};
return $delegate;
});
});
});
这不管用。在注入之前,您应该为此使用一个装饰器。Aka在模块中与$provider一起使用<代码>模块('module',函数($provide){$provide.decorator('$window',函数($delegate){$delegate.gapi={…};返回$delegate;});})@SpoBo,你的评论真的帮了我的忙,我希望它能更明显一些。我希望你能把它作为一个答案贴出来,它值得一些投票。如果你想的话,你可以自己做一个答案。很高兴它帮助了你。依赖注入程序在测试期间非常有用。@SpoBo,我接受了你的信息和j.wittwer的建议。这不是答案。请随意编辑。谢谢你的帮助!这不管用。在注入之前,您应该为此使用一个装饰器。Aka在模块中与$provider一起使用<代码>模块('module',函数($provide){$provide.decorator('$window',函数($delegate){$delegate.gapi={…};返回$delegate;});})@SpoBo,你的评论真的帮了我的忙,我希望它能更明显一些。我希望你能把它作为一个答案贴出来,它值得一些投票。如果你想的话,你可以自己做一个答案。很高兴它帮助了你。依赖注入程序在测试期间非常有用。@SpoBo,我接受了你的信息和j.wittwer的建议。这不是答案。请随意编辑。谢谢你的帮助!