From e56fb54da8a62c7dca76f88056addfb8d6ef5018 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Fri, 15 Apr 2022 11:09:19 +0200 Subject: [PATCH 1/2] fix: only set name of mocked function if string --- packages/jest-mock/src/__tests__/index.test.ts | 11 +++++++++++ packages/jest-mock/src/index.ts | 5 ++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/jest-mock/src/__tests__/index.test.ts b/packages/jest-mock/src/__tests__/index.test.ts index 4bb1e01af98c..07a4706f29a5 100644 --- a/packages/jest-mock/src/__tests__/index.test.ts +++ b/packages/jest-mock/src/__tests__/index.test.ts @@ -30,6 +30,17 @@ describe('moduleMocker', () => { expect(metadata.name).toBe('x'); }); + it('does not return broken name property', () => { + class By { + static name() { + return 'this is not a name'; + } + } + const metadata = moduleMocker.getMetadata(By); + expect(typeof By.name).toBe('function'); + expect(metadata).not.toHaveProperty('name'); + }); + it('mocks constant values', () => { const metadata = moduleMocker.getMetadata(Symbol.for('bowties.are.cool')); expect(metadata.value).toEqual(Symbol.for('bowties.are.cool')); diff --git a/packages/jest-mock/src/index.ts b/packages/jest-mock/src/index.ts index 85fe4aeb229c..7a375cdf5893 100644 --- a/packages/jest-mock/src/index.ts +++ b/packages/jest-mock/src/index.ts @@ -972,7 +972,10 @@ export class ModuleMocker { return metadata; } else if (type === 'function') { // @ts-expect-error component is a function so it has a name - metadata.name = component.name; + if (typeof component.name === 'string') { + // @ts-expect-error component is a function so it has a name + metadata.name = component.name; + } if (this.isMockFunction(component)) { metadata.mockImpl = component.getMockImplementation() as T; } From d9f99b79eb150e8f6914b3aedf3e160d1ec09bca Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Fri, 15 Apr 2022 11:11:21 +0200 Subject: [PATCH 2/2] changelog --- CHANGELOG.md | 1 + packages/jest-mock/src/index.ts | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dfa05c42e017..20361f200741 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -78,6 +78,7 @@ - `[jest-jasmine2]` Do not set `duration` to `0` for skipped tests ([#12518](https://github.com/facebook/jest/pull/12518)) - `[jest-matcher-utils]` Pass maxWidth to `pretty-format` to avoid printing every element in arrays by default ([#12402](https://github.com/facebook/jest/pull/12402)) - `[jest-mock]` Fix function overloads for `spyOn` to allow more correct type inference in complex object ([#12442](https://github.com/facebook/jest/pull/12442)) +- `[jest-mock]` Handle overridden `Function.name` property ([#12674](https://github.com/facebook/jest/pull/12674)) - `[jest-reporters]` Notifications generated by the `--notify` flag are no longer persistent in GNOME Shell. ([#11733](https://github.com/facebook/jest/pull/11733)) - `[@jest/reporters]` Move missing icon file which is needed for `NotifyReporter` class. ([#12593](https://github.com/facebook/jest/pull/12593)) - `[jest-resolver]` Call custom resolver with core node.js modules ([#12654](https://github.com/facebook/jest/pull/12654)) diff --git a/packages/jest-mock/src/index.ts b/packages/jest-mock/src/index.ts index 7a375cdf5893..b4164f26463c 100644 --- a/packages/jest-mock/src/index.ts +++ b/packages/jest-mock/src/index.ts @@ -971,10 +971,11 @@ export class ModuleMocker { metadata.value = component; return metadata; } else if (type === 'function') { - // @ts-expect-error component is a function so it has a name - if (typeof component.name === 'string') { - // @ts-expect-error component is a function so it has a name - metadata.name = component.name; + // @ts-expect-error component is a function so it has a name, but not + // necessarily a string: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#function_names_in_classes + const componentName = component.name; + if (typeof componentName === 'string') { + metadata.name = componentName; } if (this.isMockFunction(component)) { metadata.mockImpl = component.getMockImplementation() as T;