diff --git a/docs/api/vi.md b/docs/api/vi.md index 6a60cf2284d7..76806d2ef87b 100644 --- a/docs/api/vi.md +++ b/docs/api/vi.md @@ -417,6 +417,15 @@ expect(mocked.simple()).toBe('mocked') expect(mocked.nested.method()).toBe('mocked nested') ``` +Just like `vi.mock()`, you can pass `{ spy: true }` as a second argument to keep function implementations: + +```ts +const spied = vi.mockObject(original, { spy: true }) +expect(spied.simple()).toBe('value') +expect(spied.simple).toHaveBeenCalled() +expect(spied.simple.mock.results[0]).toEqual({ type: 'return', value: 'value' }) +``` + ### vi.isMockFunction - **Type:** `(fn: Function) => boolean` diff --git a/packages/vitest/src/integrations/vi.ts b/packages/vitest/src/integrations/vi.ts index 8e3d95c858af..b88f7b4ae31a 100644 --- a/packages/vitest/src/integrations/vi.ts +++ b/packages/vitest/src/integrations/vi.ts @@ -292,12 +292,17 @@ export interface VitestUtils { * * expect(mocked.simple()).toBe('mocked') * expect(mocked.nested.method()).toBe('mocked nested') + * + * const spied = vi.mockObject(original, { spy: true }) + * expect(spied.simple()).toBe('value') + * expect(spied.simple).toHaveBeenCalled() + * expect(spied.simple.mock.results[0]).toEqual({ type: 'return', value: 'value' }) * ``` * * @param value - The object to be mocked * @returns A deeply mocked version of the input object */ - mockObject: (value: T) => MaybeMockedDeep + mockObject: (value: T, options?: MockOptions) => MaybeMockedDeep /** * Type helper for TypeScript. Just returns the object that was passed. @@ -637,8 +642,8 @@ function createVitest(): VitestUtils { return _mocker().importMock(path, getImporter('importMock')) }, - mockObject(value: T) { - return _mocker().mockObject({ value }).value + mockObject(value: T, options?: MockOptions) { + return _mocker().mockObject({ value }, undefined, options?.spy ? 'autospy' : 'automock').value }, // this is typed in the interface so it's not necessary to type it here diff --git a/test/core/test/vi.spec.ts b/test/core/test/vi.spec.ts index 2748c89a8c2a..b516d2a771cd 100644 --- a/test/core/test/vi.spec.ts +++ b/test/core/test/vi.spec.ts @@ -219,6 +219,13 @@ describe('testing vi utils', () => { expect(mocked.simple()).toBe('mocked') expect(mocked.nested.method()).toBe('mocked nested') + const spied = vi.mockObject(original, { spy: true }) + expect(spied.simple()).toBe('value') + expect(spied.simple).toHaveBeenCalled() + expect(spied.simple.mock.results).toEqual([{ type: 'return', value: 'value' }]) + spied.simple.mockReturnValue('still mocked') + expect(spied.simple()).toBe('still mocked') + class OriginalClass { constructor() { throw new Error('should be mocked!')