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/__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..b4164f26463c 100644 --- a/packages/jest-mock/src/index.ts +++ b/packages/jest-mock/src/index.ts @@ -971,8 +971,12 @@ export class ModuleMocker { metadata.value = component; return metadata; } else if (type === 'function') { - // @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; }