我的应用依赖于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 = {...};
});