Skip to content

Commit 81d7601

Browse files
authored
feat: add spy option to vi.mockObject (#8285)
1 parent 43977c2 commit 81d7601

File tree

3 files changed

+24
-3
lines changed

3 files changed

+24
-3
lines changed

docs/api/vi.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,15 @@ expect(mocked.simple()).toBe('mocked')
417417
expect(mocked.nested.method()).toBe('mocked nested')
418418
```
419419

420+
Just like `vi.mock()`, you can pass `{ spy: true }` as a second argument to keep function implementations:
421+
422+
```ts
423+
const spied = vi.mockObject(original, { spy: true })
424+
expect(spied.simple()).toBe('value')
425+
expect(spied.simple).toHaveBeenCalled()
426+
expect(spied.simple.mock.results[0]).toEqual({ type: 'return', value: 'value' })
427+
```
428+
420429
### vi.isMockFunction
421430

422431
- **Type:** `(fn: Function) => boolean`

packages/vitest/src/integrations/vi.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -292,12 +292,17 @@ export interface VitestUtils {
292292
*
293293
* expect(mocked.simple()).toBe('mocked')
294294
* expect(mocked.nested.method()).toBe('mocked nested')
295+
*
296+
* const spied = vi.mockObject(original, { spy: true })
297+
* expect(spied.simple()).toBe('value')
298+
* expect(spied.simple).toHaveBeenCalled()
299+
* expect(spied.simple.mock.results[0]).toEqual({ type: 'return', value: 'value' })
295300
* ```
296301
*
297302
* @param value - The object to be mocked
298303
* @returns A deeply mocked version of the input object
299304
*/
300-
mockObject: <T>(value: T) => MaybeMockedDeep<T>
305+
mockObject: <T>(value: T, options?: MockOptions) => MaybeMockedDeep<T>
301306

302307
/**
303308
* Type helper for TypeScript. Just returns the object that was passed.
@@ -637,8 +642,8 @@ function createVitest(): VitestUtils {
637642
return _mocker().importMock(path, getImporter('importMock'))
638643
},
639644

640-
mockObject<T>(value: T) {
641-
return _mocker().mockObject({ value }).value
645+
mockObject<T>(value: T, options?: MockOptions) {
646+
return _mocker().mockObject({ value }, undefined, options?.spy ? 'autospy' : 'automock').value
642647
},
643648

644649
// this is typed in the interface so it's not necessary to type it here

test/core/test/vi.spec.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,13 @@ describe('testing vi utils', () => {
219219
expect(mocked.simple()).toBe('mocked')
220220
expect(mocked.nested.method()).toBe('mocked nested')
221221

222+
const spied = vi.mockObject(original, { spy: true })
223+
expect(spied.simple()).toBe('value')
224+
expect(spied.simple).toHaveBeenCalled()
225+
expect(spied.simple.mock.results).toEqual([{ type: 'return', value: 'value' }])
226+
spied.simple.mockReturnValue('still mocked')
227+
expect(spied.simple()).toBe('still mocked')
228+
222229
class OriginalClass {
223230
constructor() {
224231
throw new Error('should be mocked!')

0 commit comments

Comments
 (0)