Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用Jasmine有效地模拟全局属性_Javascript_Angularjs_Google Api_Jasmine_Google Api Js Client - Fatal编程技术网

Javascript 用Jasmine有效地模拟全局属性

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 = {

我的应用程序依赖于gapi javascript客户端()和jsapi()

我使用AngularJS构建我的应用程序,并使用Karma(以前是TestCular)作为测试运行者

我设法有效地模仿他们,将他们载入业力,然后监视一些方法:

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的建议。这不是答案。请随意编辑。谢谢你的帮助!