From f0a56e001193156135f8062833f5b92d6553e7fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Exbrayat?= Date: Mon, 16 Aug 2021 10:32:15 +0200 Subject: [PATCH] fix: spyOn should not rely on hasOwnProperty from the spied object (#11721) --- CHANGELOG.md | 1 + packages/jest-mock/src/__tests__/index.test.ts | 12 ++++++++++++ packages/jest-mock/src/index.ts | 5 ++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6eeedf0c6ff4..36487ee201c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - `[jest-types]` Compat with `@types/node` v16 ([#11645](https://github.com/facebook/jest/pull/11645)) - `[jest-environment-node]` Add `Event` and `EventTarget` to node global environment. ([#11705](https://github.com/facebook/jest/issues/11705)) +- `[jest-mock]` Fix `spyOn` to use `Object.prototype.hasOwnProperty` [#11721](https://github.com/facebook/jest/pull/11721) ### Chore & Maintenance diff --git a/packages/jest-mock/src/__tests__/index.test.ts b/packages/jest-mock/src/__tests__/index.test.ts index 730b6a92e4ed..854d79a1c7b7 100644 --- a/packages/jest-mock/src/__tests__/index.test.ts +++ b/packages/jest-mock/src/__tests__/index.test.ts @@ -1216,6 +1216,18 @@ describe('moduleMocker', () => { expect(originalCallArguments[1]).toBe(secondArg); expect(spy).not.toHaveBeenCalled(); }); + + it('should work with object of null prototype', () => { + const Foo = Object.assign(Object.create(null), { + foo() {}, + }); + + const spy = moduleMocker.spyOn(Foo, 'foo'); + + Foo.foo(); + + expect(spy).toHaveBeenCalled(); + }); }); describe('spyOnProperty', () => { diff --git a/packages/jest-mock/src/index.ts b/packages/jest-mock/src/index.ts index 93274dd4d47c..bdd7ac55d408 100644 --- a/packages/jest-mock/src/index.ts +++ b/packages/jest-mock/src/index.ts @@ -974,7 +974,10 @@ export class ModuleMocker { ); } - const isMethodOwner = object.hasOwnProperty(methodName); + const isMethodOwner = Object.prototype.hasOwnProperty.call( + object, + methodName, + ); let descriptor = Object.getOwnPropertyDescriptor(object, methodName); let proto = Object.getPrototypeOf(object);