diff --git a/packages/vitest/src/integrations/vi.ts b/packages/vitest/src/integrations/vi.ts index 398fa4c47142..1761494c6488 100644 --- a/packages/vitest/src/integrations/vi.ts +++ b/packages/vitest/src/integrations/vi.ts @@ -259,8 +259,12 @@ class VitestUtils { public stubGlobal(name: string | symbol | number, value: any) { if (!this._stubsGlobal.has(name)) this._stubsGlobal.set(name, Object.getOwnPropertyDescriptor(globalThis, name)) - // @ts-expect-error we can do anything! - globalThis[name] = value + Object.defineProperty(globalThis, name, { + value, + writable: true, + configurable: true, + enumerable: true, + }) return this } diff --git a/test/core/test/stubs.test.ts b/test/core/test/stubs.test.ts index 2f45cb52a859..d3a00164ec38 100644 --- a/test/core/test/stubs.test.ts +++ b/test/core/test/stubs.test.ts @@ -5,12 +5,32 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' declare global { // eslint-disable-next-line no-var var __defined__: unknown + // eslint-disable-next-line no-var + var __setter__: unknown } describe('stubbing globals', () => { beforeEach(() => { delete globalThis.__defined__ + if (globalThis.__setter__) + delete globalThis.__setter__ + vi.unstubAllGlobals() + }) + + it('overrites setter', () => { + const descriptor = { + get: () => 'getter', + set: () => {}, + configurable: true, + } + Object.defineProperty(globalThis, '__setter__', descriptor) + expect(__setter__).toBe('getter') + vi.stubGlobal('__setter__', 'stubbed') + expect(__setter__).toBe('stubbed') + expect(globalThis.__setter__).toBe('stubbed') + expect(Object.getOwnPropertyDescriptor(globalThis, '__setter__')).not.toBe(descriptor) vi.unstubAllGlobals() + expect(__setter__).toBe('getter') }) it('stubs and restores already defined value', () => { diff --git a/test/core/test/vi.spec.ts b/test/core/test/vi.spec.ts index c55f8bb1ca26..3f263485d12c 100644 --- a/test/core/test/vi.spec.ts +++ b/test/core/test/vi.spec.ts @@ -77,8 +77,7 @@ describe('testing vi utils', () => { expect(state.config.clearMocks).toBe(false) }) - // TODO: it's unstable in CI, skip until resolved - test.skip('loads unloaded module', async () => { + test('loads unloaded module', async () => { let mod: any import('../src/timeout').then(m => mod = m)