Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions docs/api/vi.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`
Expand Down
11 changes: 8 additions & 3 deletions packages/vitest/src/integrations/vi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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: <T>(value: T) => MaybeMockedDeep<T>
mockObject: <T>(value: T, options?: MockOptions) => MaybeMockedDeep<T>

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

mockObject<T>(value: T) {
return _mocker().mockObject({ value }).value
mockObject<T>(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
Expand Down
7 changes: 7 additions & 0 deletions test/core/test/vi.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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!')
Expand Down
Loading