diff --git a/packages/core/src/utils-hoist/object.ts b/packages/core/src/utils-hoist/object.ts index e0424f6aa120..13ddff35664b 100644 --- a/packages/core/src/utils-hoist/object.ts +++ b/packages/core/src/utils-hoist/object.ts @@ -32,7 +32,11 @@ export function fill(source: { [key: string]: any }, name: string, replacementFa markFunctionWrapped(wrapped, original); } - source[name] = wrapped; + try { + source[name] = wrapped; + } catch { + DEBUG_BUILD && logger.log(`Failed to replace method "${name}" in object`, source); + } } /** diff --git a/packages/core/test/utils-hoist/object.test.ts b/packages/core/test/utils-hoist/object.test.ts index de9a44b8f74c..7e39c463336c 100644 --- a/packages/core/test/utils-hoist/object.test.ts +++ b/packages/core/test/utils-hoist/object.test.ts @@ -31,6 +31,29 @@ describe('fill()', () => { expect(replacement).toBeCalled(); }); + test('does not throw on readonly properties', () => { + const originalFn = () => 41; + const source = { + get prop() { + return originalFn; + }, + set prop(_fn: () => number) { + throw new Error('OH NO, this is not writeable...'); + }, + }; + + expect(source.prop()).toEqual(41); + + const replacement = jest.fn().mockImplementation(() => { + return () => 42; + }); + fill(source, 'prop', replacement); + expect(replacement).toBeCalled(); + + expect(source.prop).toBe(originalFn); + expect(source.prop()).toEqual(41); + }); + test('can do anything inside replacement function', () => { const source = { foo: (): number => 42,