2

我的应用程序依赖于 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();
    }));

我想用 Jasmine 模拟它们,但实际上不包括它,但我可以弄清楚如何。我尝试在 beforeEach 中创建一个存根:

beforeEach(function () { window.gapi = {...} });

但它仍然是未定义的。

谢谢你的帮助。

4

2 回答 2

0

Placing @SpoBo's comment as an answer, as it fixed my problem:

beforeEach(() => {
  angular.mock.module('moduleName', $provide => {
    $provide.decorator('$window', $delegate => {
      $delegate.gapi = {
        auth2: {
          getAuthInstance: null,
        },
        // ... or whatever else you need to mock
      };
      return $delegate;
    });
  });
});
于 2018-11-08T07:59:21.910 回答
-1

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

beforeEach(inject(function($injector){
   window = $injector.get('$window');
   window.gapi = {...};
});
于 2013-04-30T19:03:09.273 回答