From a5e2404905e748059ef1eb1ab698ecc0576366c1 Mon Sep 17 00:00:00 2001 From: Rob Hogan Date: Tue, 15 Aug 2023 14:02:04 +0100 Subject: [PATCH] Revert "fix(jest-mock): clear mock when `jest.restoreAllMocks()` is called (#13867)" This reverts commit 66fb417178edca466b0afc634b0c88fe32f9884f. --- .../jest-mock/src/__tests__/index.test.ts | 130 +++--------------- packages/jest-mock/src/index.ts | 1 - 2 files changed, 19 insertions(+), 112 deletions(-) diff --git a/packages/jest-mock/src/__tests__/index.test.ts b/packages/jest-mock/src/__tests__/index.test.ts index da8fefb5b45d..6ba5685e89f8 100644 --- a/packages/jest-mock/src/__tests__/index.test.ts +++ b/packages/jest-mock/src/__tests__/index.test.ts @@ -1505,36 +1505,6 @@ describe('moduleMocker', () => { expect(spy).toHaveBeenCalled(); }); - it('supports restoring a spy', () => { - let methodOneCalls = 0; - const obj = { - methodOne() { - methodOneCalls++; - }, - }; - - const spy1 = moduleMocker.spyOn(obj, 'methodOne'); - - obj.methodOne(); - - // The spy and the original function got called. - expect(methodOneCalls).toBe(1); - expect(spy1.mock.calls).toHaveLength(1); - - expect(moduleMocker.isMockFunction(obj.methodOne)).toBe(true); - - spy1.mockRestore(); - - // After restoring the spy, the method is not mock function. - expect(moduleMocker.isMockFunction(obj.methodOne)).toBe(false); - - obj.methodOne(); - - // After restoring the spy only the real method bumps its call count, not the spy. - expect(methodOneCalls).toBe(2); - expect(spy1.mock.calls).toHaveLength(0); - }); - it('supports restoring all spies', () => { let methodOneCalls = 0; let methodTwoCalls = 0; @@ -1550,32 +1520,25 @@ describe('moduleMocker', () => { const spy1 = moduleMocker.spyOn(obj, 'methodOne'); const spy2 = moduleMocker.spyOn(obj, 'methodTwo'); + // First, we call with the spies: both spies and both original functions + // should be called. obj.methodOne(); obj.methodTwo(); - - // Both spies and both original functions got called. expect(methodOneCalls).toBe(1); expect(methodTwoCalls).toBe(1); expect(spy1.mock.calls).toHaveLength(1); expect(spy2.mock.calls).toHaveLength(1); - expect(moduleMocker.isMockFunction(obj.methodOne)).toBe(true); - expect(moduleMocker.isMockFunction(obj.methodTwo)).toBe(true); - moduleMocker.restoreAllMocks(); - // After restoring all mocks, the methods are not mock functions. - expect(moduleMocker.isMockFunction(obj.methodOne)).toBe(false); - expect(moduleMocker.isMockFunction(obj.methodTwo)).toBe(false); - + // Then, after resetting all mocks, we call methods again. Only the real + // methods should bump their count, not the spies. obj.methodOne(); obj.methodTwo(); - - // After restoring all mocks only the real methods bump their count, not the spies. expect(methodOneCalls).toBe(2); expect(methodTwoCalls).toBe(2); - expect(spy1.mock.calls).toHaveLength(0); - expect(spy2.mock.calls).toHaveLength(0); + expect(spy1.mock.calls).toHaveLength(1); + expect(spy2.mock.calls).toHaveLength(1); }); it('should work with getters', () => { @@ -1710,33 +1673,6 @@ describe('moduleMocker', () => { ); }); - it('supports restoring a spy', () => { - let methodOneCalls = 0; - const obj = { - get methodOne() { - return function () { - methodOneCalls++; - }; - }, - }; - - const spy1 = moduleMocker.spyOn(obj, 'methodOne', 'get'); - - obj.methodOne(); - - // The spy and the original function are called. - expect(methodOneCalls).toBe(1); - expect(spy1.mock.calls).toHaveLength(1); - - spy1.mockRestore(); - - obj.methodOne(); - - // After restoring the spy only the real method bumps its call count, not the spy. - expect(methodOneCalls).toBe(2); - expect(spy1.mock.calls).toHaveLength(0); - }); - it('supports restoring all spies', () => { let methodOneCalls = 0; let methodTwoCalls = 0; @@ -1756,10 +1692,10 @@ describe('moduleMocker', () => { const spy1 = moduleMocker.spyOn(obj, 'methodOne', 'get'); const spy2 = moduleMocker.spyOn(obj, 'methodTwo', 'get'); + // First, we call with the spies: both spies and both original functions + // should be called. obj.methodOne(); obj.methodTwo(); - - // Both spies and both original functions got called. expect(methodOneCalls).toBe(1); expect(methodTwoCalls).toBe(1); expect(spy1.mock.calls).toHaveLength(1); @@ -1767,14 +1703,14 @@ describe('moduleMocker', () => { moduleMocker.restoreAllMocks(); + // Then, after resetting all mocks, we call methods again. Only the real + // methods should bump their count, not the spies. obj.methodOne(); obj.methodTwo(); - - // After restoring all mocks only the real methods bump their count, not the spies. expect(methodOneCalls).toBe(2); expect(methodTwoCalls).toBe(2); - expect(spy1.mock.calls).toHaveLength(0); - expect(spy2.mock.calls).toHaveLength(0); + expect(spy1.mock.calls).toHaveLength(1); + expect(spy2.mock.calls).toHaveLength(1); }); it('should work with getters on the prototype chain', () => { @@ -1842,34 +1778,6 @@ describe('moduleMocker', () => { expect(obj.property).toBe(true); }); - it('supports restoring a spy on the prototype chain', () => { - let methodOneCalls = 0; - const prototype = { - get methodOne() { - return function () { - methodOneCalls++; - }; - }, - }; - const obj = Object.create(prototype, {}); - - const spy1 = moduleMocker.spyOn(obj, 'methodOne', 'get'); - - obj.methodOne(); - - // The spy and the original function are called. - expect(methodOneCalls).toBe(1); - expect(spy1.mock.calls).toHaveLength(1); - - spy1.mockRestore(); - - obj.methodOne(); - - // After restoring the spy only the real method bumps its call count, not the spy. - expect(methodOneCalls).toBe(2); - expect(spy1.mock.calls).toHaveLength(0); - }); - it('supports restoring all spies on the prototype chain', () => { let methodOneCalls = 0; let methodTwoCalls = 0; @@ -1890,10 +1798,10 @@ describe('moduleMocker', () => { const spy1 = moduleMocker.spyOn(obj, 'methodOne', 'get'); const spy2 = moduleMocker.spyOn(obj, 'methodTwo', 'get'); + // First, we call with the spies: both spies and both original functions + // should be called. obj.methodOne(); obj.methodTwo(); - - // Both spies and both original functions got called. expect(methodOneCalls).toBe(1); expect(methodTwoCalls).toBe(1); expect(spy1.mock.calls).toHaveLength(1); @@ -1901,14 +1809,14 @@ describe('moduleMocker', () => { moduleMocker.restoreAllMocks(); + // Then, after resetting all mocks, we call methods again. Only the real + // methods should bump their count, not the spies. obj.methodOne(); obj.methodTwo(); - - // After restoring all mocks only the real methods bump their count, not the spies. expect(methodOneCalls).toBe(2); expect(methodTwoCalls).toBe(2); - expect(spy1.mock.calls).toHaveLength(0); - expect(spy2.mock.calls).toHaveLength(0); + expect(spy1.mock.calls).toHaveLength(1); + expect(spy2.mock.calls).toHaveLength(1); }); }); @@ -1947,7 +1855,7 @@ describe('moduleMocker', () => { expect(obj.property).toBe(1); }); - it('should allow mocking with value of different type', () => { + it('should allow mocking with value of different value', () => { const obj = { property: 1, }; diff --git a/packages/jest-mock/src/index.ts b/packages/jest-mock/src/index.ts index ea021839ebf8..21556c612c03 100644 --- a/packages/jest-mock/src/index.ts +++ b/packages/jest-mock/src/index.ts @@ -1424,7 +1424,6 @@ export class ModuleMocker { } restoreAllMocks(): void { - this._mockState = new WeakMap(); this._spyState.forEach(restore => restore()); this._spyState = new Set(); }