From da7cb945077f627305cfaff8b32031bcceebdf23 Mon Sep 17 00:00:00 2001 From: "felipe.richter" Date: Fri, 23 Dec 2022 17:29:40 -0300 Subject: [PATCH 1/9] resetMock now returns original value instead of undefined --- packages/jest-mock/src/index.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/jest-mock/src/index.ts b/packages/jest-mock/src/index.ts index 93c33413c3f0..4a25a9ea476e 100644 --- a/packages/jest-mock/src/index.ts +++ b/packages/jest-mock/src/index.ts @@ -487,6 +487,7 @@ export class ModuleMocker { private _mockConfigRegistry: WeakMap; private _spyState: Set<() => void>; private _invocationCallCounter: number; + private _originalFn: WeakMap; /** * @see README.md @@ -499,6 +500,7 @@ export class ModuleMocker { this._mockConfigRegistry = new WeakMap(); this._spyState = new Set(); this._invocationCallCounter = 1; + this._originalFn = new WeakMap(); } private _getSlots(object?: Record): Array { @@ -753,7 +755,12 @@ export class ModuleMocker { f.mockReset = () => { f.mockClear(); - this._mockConfigRegistry.delete(f); + const originalFn = this._originalFn.get(f); + const originalMockImpl = { + ...this._defaultMockConfig(), + mockImpl: originalFn, + }; + this._mockConfigRegistry.set(f, originalMockImpl); return f; }; @@ -1166,7 +1173,7 @@ export class ModuleMocker { return original.apply(this, arguments); }); } - + this._originalFn.set(object[methodKey], original); return object[methodKey] as Mock; } From a7efd834c0bc4f1c3786ff4fd1a59708950a2bd4 Mon Sep 17 00:00:00 2001 From: "felipe.richter" Date: Mon, 2 Jan 2023 14:53:24 -0300 Subject: [PATCH 2/9] reset all gives back the previous state --- packages/jest-mock/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/jest-mock/src/index.ts b/packages/jest-mock/src/index.ts index 4a25a9ea476e..847acaa68107 100644 --- a/packages/jest-mock/src/index.ts +++ b/packages/jest-mock/src/index.ts @@ -1242,6 +1242,7 @@ export class ModuleMocker { } resetAllMocks(): void { + this._spyState.forEach(reset => reset()); this._mockConfigRegistry = new WeakMap(); this._mockState = new WeakMap(); } From f86aa23e6ee8706c5277f8af8f5a5da3de43956b Mon Sep 17 00:00:00 2001 From: "felipe.richter" Date: Tue, 3 Jan 2023 16:14:35 -0300 Subject: [PATCH 3/9] add e2e mock reset test --- e2e/mock-reset/__tests__/index.test.js | 46 ++++++++++++++++++++++++++ e2e/mock-reset/package.json | 5 +++ 2 files changed, 51 insertions(+) create mode 100644 e2e/mock-reset/__tests__/index.test.js create mode 100644 e2e/mock-reset/package.json diff --git a/e2e/mock-reset/__tests__/index.test.js b/e2e/mock-reset/__tests__/index.test.js new file mode 100644 index 000000000000..6b5003269e35 --- /dev/null +++ b/e2e/mock-reset/__tests__/index.test.js @@ -0,0 +1,46 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +describe('with mock reset', () => { + const myObject = {bar: () => 'bar'}; + + let barStub; + + beforeAll(() => { + barStub = jest.spyOn(myObject, 'bar'); + }); + + test('after mock reset, bar should return to its original value', () => { + barStub.mockReturnValue('POTATO!'); + expect(myObject.bar()).toBe('POTATO!'); + barStub.mockReset(); + + // This expect should be successful + expect(myObject.bar()).toBe('bar'); + }); +}); + +describe('with reset all mocks', () => { + const myObject = {bar: () => 'bar', foo: () => 'foo'}; + + let barStub; + + beforeAll(() => { + barStub = jest.spyOn(myObject, 'bar'); + }); + + test('after reset all, bar should return to its original value', () => { + barStub.mockReturnValue('POTATO!'); + expect(myObject.bar()).toBe('POTATO!'); + jest.resetAllMocks(); + + // This expect should be successful + expect(myObject.bar()).toBe('bar'); + }); +}); diff --git a/e2e/mock-reset/package.json b/e2e/mock-reset/package.json new file mode 100644 index 000000000000..148788b25446 --- /dev/null +++ b/e2e/mock-reset/package.json @@ -0,0 +1,5 @@ +{ + "jest": { + "testEnvironment": "node" + } +} From cda42a32c61728177c77bb2be08217257fbce1c3 Mon Sep 17 00:00:00 2001 From: "felipe.richter" Date: Tue, 3 Jan 2023 16:37:33 -0300 Subject: [PATCH 4/9] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fb895c3062e..5e62c509fefe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ ### Fixes +- `[jest-mock]` fix mockReset and resetAllMocks undefined return ([#13692](https://github.com/facebook/jest/pull/13692)) - `[jest-environment-node]` fix non-configurable globals ([#13687](https://github.com/facebook/jest/pull/13687)) - `[@jest/expect-utils]` `toMatchObject` should handle `Symbol` properties ([#13639](https://github.com/facebook/jest/pull/13639)) - `[jest-resolve]` Add global paths to `require.resolve.paths` ([#13633](https://github.com/facebook/jest/pull/13633)) From c92375f1b28f4edbffdefe3a8c2e50add96010d8 Mon Sep 17 00:00:00 2001 From: "felipe.richter" Date: Tue, 3 Jan 2023 17:09:05 -0300 Subject: [PATCH 5/9] update docs --- docs/MockFunctionAPI.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/MockFunctionAPI.md b/docs/MockFunctionAPI.md index 157b1e0b873b..cf24c29b3c75 100644 --- a/docs/MockFunctionAPI.md +++ b/docs/MockFunctionAPI.md @@ -126,7 +126,7 @@ The [`clearMocks`](configuration#clearmocks-boolean) configuration option is ava Does everything that [`mockFn.mockClear()`](#mockfnmockclear) does, and also removes any mocked return values or implementations. -This is useful when you want to completely reset a _mock_ back to its initial state. (Note that resetting a _spy_ will result in a function with no return value). +This is useful when you want to completely reset a _mock_ back to its initial state. The [`resetMocks`](configuration#resetmocks-boolean) configuration option is available to reset mocks automatically before each test. From 36b8ac7687c4ef77a7cda6adb86ae76dd45fba0d Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Wed, 4 Jan 2023 13:32:53 +0100 Subject: [PATCH 6/9] move changelog entry --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 326bb1ebed8b..747bdfb3d239 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,9 +11,9 @@ ### Fixes -- `[jest-mock]` fix mockReset and resetAllMocks undefined return ([#13692](https://github.com/facebook/jest/pull/13692)) - `[jest-environment-node]` fix non-configurable globals ([#13687](https://github.com/facebook/jest/pull/13687)) - `[@jest/expect-utils]` `toMatchObject` should handle `Symbol` properties ([#13639](https://github.com/facebook/jest/pull/13639)) +- `[jest-mock]` fix mockReset and resetAllMocks undefined return ([#13692](https://github.com/facebook/jest/pull/13692)) - `[jest-resolve]` Add global paths to `require.resolve.paths` ([#13633](https://github.com/facebook/jest/pull/13633)) - `[jest-runtime]` Support Wasm files that import JS resources ([#13608](https://github.com/facebook/jest/pull/13608)) - `[jest-snapshot]` Make sure to import `babel` outside of the sandbox ([#13694](https://github.com/facebook/jest/pull/13694)) From 961c562998499577c9095ef81944e7809605de49 Mon Sep 17 00:00:00 2001 From: "felipe.richter" Date: Wed, 4 Jan 2023 11:23:18 -0300 Subject: [PATCH 7/9] resolves type conflict --- packages/jest-mock/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jest-mock/src/index.ts b/packages/jest-mock/src/index.ts index cd92886e6937..5ff1ca67dade 100644 --- a/packages/jest-mock/src/index.ts +++ b/packages/jest-mock/src/index.ts @@ -1222,7 +1222,7 @@ export class ModuleMocker { return original.apply(this, arguments); }); } - this._originalFn.set(object[methodKey], original); + this._originalFn.set(object[methodKey] as Mock, original); return object[methodKey] as Mock; } From 69cdb87c281dd59c7c60814b9e0e85c4b4b62def Mon Sep 17 00:00:00 2001 From: feliperli Date: Fri, 6 Jan 2023 09:29:36 -0300 Subject: [PATCH 8/9] change e2e to unit test --- e2e/mock-reset/__tests__/index.test.js | 46 ------------------- e2e/mock-reset/package.json | 5 -- .../jest-mock/src/__tests__/index.test.ts | 24 ++++++++++ 3 files changed, 24 insertions(+), 51 deletions(-) delete mode 100644 e2e/mock-reset/__tests__/index.test.js delete mode 100644 e2e/mock-reset/package.json diff --git a/e2e/mock-reset/__tests__/index.test.js b/e2e/mock-reset/__tests__/index.test.js deleted file mode 100644 index 6b5003269e35..000000000000 --- a/e2e/mock-reset/__tests__/index.test.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -'use strict'; - -describe('with mock reset', () => { - const myObject = {bar: () => 'bar'}; - - let barStub; - - beforeAll(() => { - barStub = jest.spyOn(myObject, 'bar'); - }); - - test('after mock reset, bar should return to its original value', () => { - barStub.mockReturnValue('POTATO!'); - expect(myObject.bar()).toBe('POTATO!'); - barStub.mockReset(); - - // This expect should be successful - expect(myObject.bar()).toBe('bar'); - }); -}); - -describe('with reset all mocks', () => { - const myObject = {bar: () => 'bar', foo: () => 'foo'}; - - let barStub; - - beforeAll(() => { - barStub = jest.spyOn(myObject, 'bar'); - }); - - test('after reset all, bar should return to its original value', () => { - barStub.mockReturnValue('POTATO!'); - expect(myObject.bar()).toBe('POTATO!'); - jest.resetAllMocks(); - - // This expect should be successful - expect(myObject.bar()).toBe('bar'); - }); -}); diff --git a/e2e/mock-reset/package.json b/e2e/mock-reset/package.json deleted file mode 100644 index 148788b25446..000000000000 --- a/e2e/mock-reset/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "jest": { - "testEnvironment": "node" - } -} diff --git a/packages/jest-mock/src/__tests__/index.test.ts b/packages/jest-mock/src/__tests__/index.test.ts index 5bfbbd877223..5c94004d8cfe 100644 --- a/packages/jest-mock/src/__tests__/index.test.ts +++ b/packages/jest-mock/src/__tests__/index.test.ts @@ -1215,6 +1215,30 @@ describe('moduleMocker', () => { expect(fn.getMockName()).toBe('jest.fn()'); }); + test('after mock reset, the object should return to its original value', () => { + const myObject = {bar: () => 'bar'}; + + const barStub = jest.spyOn(myObject, 'bar'); + + barStub.mockReturnValue('POTATO!'); + expect(myObject.bar()).toBe('POTATO!'); + barStub.mockReset(); + + expect(myObject.bar()).toBe('bar'); + }); + + test('after resetAllMocks, the object should return to its original value', () => { + const myObject = {bar: () => 'bar'}; + + const barStub = jest.spyOn(myObject, 'bar'); + + barStub.mockReturnValue('POTATO!'); + expect(myObject.bar()).toBe('POTATO!'); + jest.resetAllMocks(); + + expect(myObject.bar()).toBe('bar'); + }); + test('mockName gets reset by mockRestore', () => { const fn = jest.fn(); expect(fn.getMockName()).toBe('jest.fn()'); From ba31a1f5a0f61b1122652e0d139ba5f455e3f4ca Mon Sep 17 00:00:00 2001 From: feliperli Date: Fri, 6 Jan 2023 09:39:41 -0300 Subject: [PATCH 9/9] adjust to moduleMocker --- packages/jest-mock/src/__tests__/index.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/jest-mock/src/__tests__/index.test.ts b/packages/jest-mock/src/__tests__/index.test.ts index 5c94004d8cfe..27b13b594c18 100644 --- a/packages/jest-mock/src/__tests__/index.test.ts +++ b/packages/jest-mock/src/__tests__/index.test.ts @@ -1218,7 +1218,7 @@ describe('moduleMocker', () => { test('after mock reset, the object should return to its original value', () => { const myObject = {bar: () => 'bar'}; - const barStub = jest.spyOn(myObject, 'bar'); + const barStub = moduleMocker.spyOn(myObject, 'bar'); barStub.mockReturnValue('POTATO!'); expect(myObject.bar()).toBe('POTATO!'); @@ -1230,11 +1230,11 @@ describe('moduleMocker', () => { test('after resetAllMocks, the object should return to its original value', () => { const myObject = {bar: () => 'bar'}; - const barStub = jest.spyOn(myObject, 'bar'); + const barStub = moduleMocker.spyOn(myObject, 'bar'); barStub.mockReturnValue('POTATO!'); expect(myObject.bar()).toBe('POTATO!'); - jest.resetAllMocks(); + moduleMocker.resetAllMocks(); expect(myObject.bar()).toBe('bar'); });