Change window.stub to stub a single method and return it

Change-Id: Icdf8a5db31929c7a0ce99ef6118e9ce4cd9657c6
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.js b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.js
index 992ac54..69c218c 100644
--- a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.js
+++ b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.js
@@ -430,9 +430,7 @@
 
     suite('repos', () => {
       setup(() => {
-        stub('gr-repo-access', {
-          _repoChanged: () => {},
-        });
+        stub('gr-repo-access', '_repoChanged').callsFake(() => {});
       });
 
       test('repo list', () => {
@@ -499,12 +497,8 @@
     suite('groups', () => {
       let getGroupConfigStub;
       setup(() => {
-        stub('gr-group', {
-          _loadGroup: () => Promise.resolve({}),
-        });
-        stub('gr-group-members', {
-          _loadGroupDetails: () => {},
-        });
+        stub('gr-group', '_loadGroup').callsFake(() => Promise.resolve({}));
+        stub('gr-group-members', '_loadGroupDetails').callsFake(() => {});
 
         getGroupConfigStub = stubRestApi('getGroupConfig');
         getGroupConfigStub.returns(Promise.resolve({
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.js b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.js
index a1e227b..b8ba86c 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.js
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.js
@@ -84,13 +84,11 @@
       stubRestApi('getDiffRobotComments').returns(Promise.resolve({}));
       stubRestApi('getDiffDrafts').returns(Promise.resolve({}));
       stubRestApi('getAccountCapabilities').returns(Promise.resolve({}));
-      stub('gr-date-formatter', {
-        _loadTimeFormat() { return Promise.resolve(''); },
-      });
-      stub('gr-diff-host', {
-        reload() { return Promise.resolve(); },
-        prefetchDiff() {},
-      });
+      stub('gr-date-formatter', '_loadTimeFormat').callsFake(() =>
+        Promise.resolve('')
+      );
+      stub('gr-diff-host', 'reload').callsFake(() => Promise.resolve());
+      stub('gr-diff-host', 'prefetchDiff').callsFake(() => {});
 
       // Element must be wrapped in an element with direct access to the
       // comment API.
@@ -1409,13 +1407,11 @@
       stubRestApi('getDiffComments').returns(Promise.resolve({}));
       stubRestApi('getDiffRobotComments').returns(Promise.resolve({}));
       stubRestApi('getDiffDrafts').returns(Promise.resolve({}));
-      stub('gr-date-formatter', {
-        _loadTimeFormat() { return Promise.resolve(''); },
-      });
-      stub('gr-diff-host', {
-        reload() { return Promise.resolve(); },
-        prefetchDiff() {},
-      });
+      stub('gr-date-formatter', '_loadTimeFormat').callsFake(() =>
+        Promise.resolve('')
+      );
+      stub('gr-diff-host', 'reload').callsFake(() => Promise.resolve());
+      stub('gr-diff-host', 'prefetchDiff').callsFake(() => {});
 
       // Element must be wrapped in an element with direct access to the
       // comment API.
diff --git a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header_test.ts b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header_test.ts
index f764373..784b440 100644
--- a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header_test.ts
+++ b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header_test.ts
@@ -35,11 +35,7 @@
 
   setup(() => {
     stubRestApi('probePath').returns(Promise.resolve(false));
-    stub('gr-main-header', {
-      _loadAccount() {
-        return Promise.resolve();
-      },
-    });
+    stub('gr-main-header', '_loadAccount').callsFake(() => Promise.resolve());
     element = basicFixture.instantiate();
   });
 
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-diff-highlight_test.js b/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-diff-highlight_test.js
index 11b1f38..07e83a8 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-diff-highlight_test.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-diff-highlight_test.js
@@ -266,10 +266,8 @@
 
     setup(() => {
       contentStubs = [];
-      stub('gr-selection-action-box', {
-        placeAbove: sinon.stub(),
-        placeBelow: sinon.stub(),
-      });
+      stub('gr-selection-action-box', 'placeAbove');
+      stub('gr-selection-action-box', 'placeBelow');
       diff = element.querySelector('#diffTable');
       builder = {
         getContentTdByLine: sinon.stub(),
diff --git a/polygerrit-ui/app/elements/gr-app_test.js b/polygerrit-ui/app/elements/gr-app_test.js
index 1a04411..8178c89 100644
--- a/polygerrit-ui/app/elements/gr-app_test.js
+++ b/polygerrit-ui/app/elements/gr-app_test.js
@@ -30,12 +30,8 @@
 
   setup(done => {
     sinon.stub(appContext.reportingService, 'appStarted');
-    stub('gr-account-dropdown', {
-      _getTopContent: sinon.stub(),
-    });
-    stub('gr-router', {
-      start: sinon.stub(),
-    });
+    stub('gr-account-dropdown', '_getTopContent');
+    stub('gr-router', 'start');
     stubRestApi('getAccount').returns(Promise.resolve({}));
     stubRestApi('getAccountCapabilities').returns(Promise.resolve({}));
     configStub = stubRestApi('getConfig').returns(Promise.resolve({
diff --git a/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-plugin-popup_test.js b/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-plugin-popup_test.js
index f2d83e8..6ce77b1 100644
--- a/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-plugin-popup_test.js
+++ b/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-plugin-popup_test.js
@@ -25,10 +25,8 @@
 
   setup(() => {
     element = basicFixture.instantiate();
-    stub('gr-overlay', {
-      open: sinon.stub().returns(Promise.resolve()),
-      close: sinon.stub(),
-    });
+    stub('gr-overlay', 'open').callsFake(() => Promise.resolve());
+    stub('gr-overlay', 'close');
   });
 
   test('exists', () => {
diff --git a/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar_test.js b/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar_test.js
index 0eef5a7..df8632f 100644
--- a/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar_test.js
+++ b/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar_test.js
@@ -103,9 +103,9 @@
 
   suite('config set', () => {
     setup(() => {
-      stub('gr-avatar', {
-        _getConfig: () => Promise.resolve({plugin: {has_avatars: true}}),
-      });
+      stub('gr-avatar', '_getConfig').callsFake(() =>
+        Promise.resolve({plugin: {has_avatars: true}})
+      );
       element = basicFixture.instantiate();
     });
 
@@ -141,9 +141,9 @@
     let element;
 
     setup(() => {
-      stub('gr-avatar', {
-        _getConfig: () => Promise.resolve({plugin: {has_avatars: true}}),
-      });
+      stub('gr-avatar', '_getConfig').callsFake(() =>
+        Promise.resolve({plugin: {has_avatars: true}})
+      );
 
       element = basicFixture.instantiate();
     });
@@ -169,9 +169,7 @@
     let element;
 
     setup(() => {
-      stub('gr-avatar', {
-        _getConfig: () => Promise.resolve({}),
-      });
+      stub('gr-avatar', '_getConfig').callsFake(() => Promise.resolve({}));
 
       element = basicFixture.instantiate();
     });
diff --git a/polygerrit-ui/app/test/common-test-setup.ts b/polygerrit-ui/app/test/common-test-setup.ts
index 848eeaf..016c1e4 100644
--- a/polygerrit-ui/app/test/common-test-setup.ts
+++ b/polygerrit-ui/app/test/common-test-setup.ts
@@ -33,7 +33,7 @@
   TestKeyboardShortcutBinder,
 } from './test-utils';
 import {_testOnly_getShortcutManagerInstance} from '../mixins/keyboard-shortcut-mixin/keyboard-shortcut-mixin';
-import sinon, {SinonSpy} from 'sinon/pkg/sinon-esm';
+import sinon from 'sinon/pkg/sinon-esm';
 import {safeTypesBridge} from '../utils/safe-types-util';
 import {_testOnly_initGerritPluginApi} from '../elements/shared/gr-js-api-interface/gr-gerrit';
 import {initGlobalVariables} from '../elements/gr-app-global-var-init';
@@ -126,22 +126,18 @@
 
 // For karma always set our implementation
 // (karma doesn't provide the stub method)
-function stubImpl<T extends keyof HTMLElementTagNameMap>(
-  tagName: T,
-  implementation: Partial<HTMLElementTagNameMap[T]>
-) {
+function stubImpl<
+  T extends keyof HTMLElementTagNameMap,
+  K extends keyof HTMLElementTagNameMap[T]
+>(tagName: T, method: K) {
   // This method is inspired by web-component-tester method
   const proto = document.createElement(tagName).constructor
     .prototype as HTMLElementTagNameMap[T];
-  const stubs: SinonSpy[] = [];
-  for (const [key, value] of Object.entries(implementation)) {
-    stubs.push(sinon.stub(proto, key).callsFake(value));
-  }
+  const stub = sinon.stub(proto, method);
   registerTestCleanup(() => {
-    stubs.forEach(stub => {
-      stub.restore();
-    });
+    stub.restore();
   });
+  return stub;
 }
 
 window.stub = stubImpl;