From 642febdaee105892c8b42586d3e7c825dcc87c10 Mon Sep 17 00:00:00 2001 From: Domas Trijonis Date: Tue, 8 Jan 2019 21:22:41 +0100 Subject: [PATCH] fix: SpyObj and T union --- types/jasmine/index.d.ts | 2 +- types/jasmine/jasmine-tests.ts | 25 +++++++++++++++++-------- types/jasmine/v2/index.d.ts | 2 +- types/jasmine/v2/jasmine-tests.ts | 23 ++++++++++++++++------- 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/types/jasmine/index.d.ts b/types/jasmine/index.d.ts index 2109645eef..fd053cf3d6 100644 --- a/types/jasmine/index.d.ts +++ b/types/jasmine/index.d.ts @@ -701,7 +701,7 @@ declare namespace jasmine { withArgs(...args: any[]): Spy; } - type SpyObj = { + type SpyObj = T & { [k in keyof T]: T[k] extends Function ? T[k] & Spy : T[k]; } diff --git a/types/jasmine/jasmine-tests.ts b/types/jasmine/jasmine-tests.ts index bf3598fda9..217a5463f0 100644 --- a/types/jasmine/jasmine-tests.ts +++ b/types/jasmine/jasmine-tests.ts @@ -723,19 +723,24 @@ describe("A spy, when created manually", () => { }); describe("Multiple spies, when created manually", () => { - interface Tape { - play(): void; - pause(): void; - rewind(pos: number): void; - stop(): void; + class Tape { + private rewindTo: number; + play(): void { }; + pause(): void { }; + rewind(pos: number): void { + this.rewindTo = pos; + }; + stop(): void { }; readonly isPlaying: boolean; // spy obj makes this writable } - var tape: jasmine.SpyObj; + var tape: Tape; + var tapeSpy: jasmine.SpyObj; var el: jasmine.SpyObj; beforeEach(() => { - tape = jasmine.createSpyObj('tape', ['play', 'pause', 'stop', 'rewind']); + tapeSpy = jasmine.createSpyObj('tape', ['play', 'pause', 'stop', 'rewind']); + tape = tapeSpy; (tape as { isPlaying: boolean }).isPlaying = false; el = jasmine.createSpyObj('Element', ['hasAttribute']); @@ -745,6 +750,10 @@ describe("Multiple spies, when created manually", () => { tape.play(); tape.pause(); tape.rewind(0); + + tapeSpy.play.and.callThrough(); + tapeSpy.pause.and.callThrough(); + tapeSpy.rewind.and.callThrough(); }); it("creates spies for each requested function", () => { @@ -767,7 +776,7 @@ describe("Multiple spies, when created manually", () => { it("read isPlaying property", () => { expect(tape.isPlaying).toBe(false); - }) + }); }); describe("multiple spies, when created with spyOnAllFunctions", () => { diff --git a/types/jasmine/v2/index.d.ts b/types/jasmine/v2/index.d.ts index 4211cf2ca0..a248093082 100644 --- a/types/jasmine/v2/index.d.ts +++ b/types/jasmine/v2/index.d.ts @@ -629,7 +629,7 @@ declare namespace jasmine { calls: Calls; } - type SpyObj = { + type SpyObj = T & { [k in keyof T]: T[k] extends Function ? T[k] & Spy : T[k]; } diff --git a/types/jasmine/v2/jasmine-tests.ts b/types/jasmine/v2/jasmine-tests.ts index f79c3627eb..167aca1981 100644 --- a/types/jasmine/v2/jasmine-tests.ts +++ b/types/jasmine/v2/jasmine-tests.ts @@ -643,19 +643,24 @@ describe("A spy, when created manually", () => { }); describe("Multiple spies, when created manually", () => { - interface Tape { - play(): void; - pause(): void; - rewind(pos: number): void; - stop(): void; + abstract class Tape { + private rewindTo: number; + play(): void { }; + pause(): void { }; + rewind(pos: number): void { + this.rewindTo = pos; + }; + stop(): void { }; readonly isPlaying: boolean; // spy obj makes this writable } - var tape: jasmine.SpyObj; + var tape: Tape; + var tapeSpy: jasmine.SpyObj; var el: jasmine.SpyObj; beforeEach(() => { - tape = jasmine.createSpyObj('tape', ['play', 'pause', 'stop', 'rewind']); + tapeSpy = jasmine.createSpyObj('tape', ['play', 'pause', 'stop', 'rewind']); + tape = tapeSpy; (tape as { isPlaying: boolean }).isPlaying = false; el = jasmine.createSpyObj('Element', ['hasAttribute']); @@ -665,6 +670,10 @@ describe("Multiple spies, when created manually", () => { tape.play(); tape.pause(); tape.rewind(0); + + tapeSpy.play.and.callThrough(); + tapeSpy.pause.and.callThrough(); + tapeSpy.rewind.and.callThrough(); }); it("creates spies for each requested function", () => {