From 0d69a73169ac449f9690f9d8c6b4a9572363518b Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Fri, 10 Feb 2023 12:41:06 +0200 Subject: [PATCH] fix(jest-mock): prevent `mockImplementationOnce` bleeding into `withImplementation` (#13888) --- CHANGELOG.md | 1 + .../jest-mock/src/__tests__/index.test.ts | 32 +++++++++++++++++++ packages/jest-mock/src/index.ts | 4 +++ 3 files changed, 37 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03ef13cafa2f..ce86f3d161fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ ### Fixes - `[jest-mock]` Clear mock state when `jest.restoreAllMocks()` is called ([#13867](https://github.com/facebook/jest/pull/13867)) +- `[jest-mock]` Prevent `mockImplementationOnce` and `mockReturnValueOnce` bleeding into `withImplementation` ([#13888](https://github.com/facebook/jest/pull/13888)) ### Chore & Maintenance diff --git a/packages/jest-mock/src/__tests__/index.test.ts b/packages/jest-mock/src/__tests__/index.test.ts index 81e594c461ac..1b13b93acd72 100644 --- a/packages/jest-mock/src/__tests__/index.test.ts +++ b/packages/jest-mock/src/__tests__/index.test.ts @@ -1143,6 +1143,38 @@ describe('moduleMocker', () => { expect.assertions(4); }); + + it('mockImplementationOnce does not bleed into withImplementation', () => { + const mock = jest + .fn(() => 'outside callback') + .mockImplementationOnce(() => 'once'); + + mock.withImplementation( + () => 'inside callback', + () => { + expect(mock()).toBe('inside callback'); + }, + ); + + expect(mock()).toBe('once'); + expect(mock()).toBe('outside callback'); + }); + + it('mockReturnValueOnce does not bleed into withImplementation', () => { + const mock = jest + .fn(() => 'outside callback') + .mockReturnValueOnce('once'); + + mock.withImplementation( + () => 'inside callback', + () => { + expect(mock()).toBe('inside callback'); + }, + ); + + expect(mock()).toBe('once'); + expect(mock()).toBe('outside callback'); + }); }); test('mockReturnValue does not override mockImplementationOnce', () => { diff --git a/packages/jest-mock/src/index.ts b/packages/jest-mock/src/index.ts index b741f7b0b4ba..bec770b88ef9 100644 --- a/packages/jest-mock/src/index.ts +++ b/packages/jest-mock/src/index.ts @@ -840,16 +840,20 @@ export class ModuleMocker { // Remember previous mock implementation, then set new one const mockConfig = this._ensureMockConfig(f); const previousImplementation = mockConfig.mockImpl; + const previousSpecificImplementations = mockConfig.specificMockImpls; mockConfig.mockImpl = fn; + mockConfig.specificMockImpls = []; const returnedValue = callback(); if (isPromise(returnedValue)) { return returnedValue.then(() => { mockConfig.mockImpl = previousImplementation; + mockConfig.specificMockImpls = previousSpecificImplementations; }); } else { mockConfig.mockImpl = previousImplementation; + mockConfig.specificMockImpls = previousSpecificImplementations; } }