用Jasmine有效地模拟全局属性



我的应用依赖于gapi javascript客户端(https://apis.google.com/js/api.js)和jsapi (https://www.google.com/jsapi)。

我用AngularJS构建我的应用程序,并使用Karma(以前的Testacular)作为测试运行器。

我设法通过在Karma中加载它们来有效地模拟它们,然后监视一些方法:

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:

中创建一个存根
beforeEach(function () { 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;
    });
  });
});

我认为你想使用注入器来获取$window提供程序,然后你可以将mock添加到该对象中。

beforeEach(inject(function($injector){
   window = $injector.get('$window');
   window.gapi = {...};
});

相关内容

  • 没有找到相关文章

最新更新