22 * @vitest -environment jsdom
33 */
44
5- import type { Mock , MockedFunction , MockedObject , MockInstance } from 'vitest'
5+ import type { Mock , Mocked , MockedFunction , MockedObject , MockInstance } from 'vitest'
66import { describe , expect , expectTypeOf , test , vi } from 'vitest'
77import { getWorkerState } from '../../../packages/vitest/src/runtime/utils'
88
@@ -56,33 +56,49 @@ describe('testing vi utils', () => {
5656 baz : string
5757 }
5858
59- const mockFactory = vi . fn < ( ) => FooBar > ( )
59+ const mockFnFactory = vi . fn < ( ) => FooBar > ( )
6060
61- vi . mocked ( mockFactory , { partial : true } ) . mockReturnValue ( {
61+ vi . mocked ( mockFnFactory , { partial : true } ) . mockReturnValue ( {
6262 foo : vi . fn ( ) ,
6363 } )
6464
65- vi . mocked ( mockFactory , { partial : true , deep : false } ) . mockReturnValue ( {
65+ vi . mocked ( mockFnFactory , { partial : true , deep : false } ) . mockReturnValue ( {
6666 bar : vi . fn < FooBar [ 'bar' ] > ( ) ,
6767 } )
6868
69- vi . mocked ( mockFactory , { partial : true , deep : true } ) . mockReturnValue ( {
69+ vi . mocked ( mockFnFactory , { partial : true , deep : true } ) . mockReturnValue ( {
7070 baz : 'baz' ,
7171 } )
7272
73- const mockFactoryAsync = vi . fn < ( ) => Promise < FooBar > > ( )
73+ if ( 0 ) {
74+ const mockFactory = ( ) : FooBar => ( { } as FooBar )
7475
75- vi . mocked ( mockFactoryAsync , { partial : true } ) . mockResolvedValue ( {
76- foo : vi . fn ( ) ,
77- } )
76+ vi . mocked ( mockFactory , { partial : true } ) . mockReturnValue ( {
77+ foo : vi . fn ( ) ,
78+ } )
7879
79- vi . mocked ( mockFactoryAsync , { partial : true , deep : false } ) . mockResolvedValue ( {
80- bar : vi . fn < FooBar [ 'bar' ] > ( ) ,
81- } )
80+ vi . mocked ( mockFactory , { partial : true , deep : false } ) . mockReturnValue ( {
81+ bar : vi . fn < FooBar [ 'bar' ] > ( ) ,
82+ } )
8283
83- vi . mocked ( mockFactoryAsync , { partial : true , deep : true } ) . mockResolvedValue ( {
84- baz : 'baz' ,
85- } )
84+ vi . mocked ( mockFactory , { partial : true , deep : true } ) . mockReturnValue ( {
85+ baz : 'baz' ,
86+ } )
87+
88+ const mockFactoryAsync = async ( ) : Promise < FooBar > => ( { } as FooBar )
89+
90+ vi . mocked ( mockFactoryAsync , { partial : true } ) . mockResolvedValue ( {
91+ foo : vi . fn ( ) ,
92+ } )
93+
94+ vi . mocked ( mockFactoryAsync , { partial : true , deep : false } ) . mockResolvedValue ( {
95+ bar : vi . fn < FooBar [ 'bar' ] > ( ) ,
96+ } )
97+
98+ vi . mocked ( mockFactoryAsync , { partial : true , deep : true } ) . mockResolvedValue ( {
99+ baz : 'baz' ,
100+ } )
101+ }
86102
87103 function fetchSomething ( ) : Promise < Response > {
88104 return fetch ( 'https://vitest.dev/' )
@@ -94,6 +110,33 @@ describe('testing vi utils', () => {
94110 }
95111 } )
96112
113+ test ( 'vi.mocked with classes' , ( ) => {
114+ class Foo {
115+ constructor ( public readonly bar : string ) { }
116+
117+ public getBar ( ) : string {
118+ return this . bar
119+ }
120+ }
121+ class FooMock implements Mocked < Foo > {
122+ readonly barMock : Mock < ( ) => string > = vi . fn ( )
123+
124+ public get bar ( ) : string {
125+ return this . barMock ( )
126+ }
127+
128+ public getBar : Mock < ( ) => string > = vi
129+ . fn ( )
130+ . mockImplementation ( ( ) => this . barMock ( ) )
131+ }
132+
133+ // type check only
134+ if ( 0 ) {
135+ vi . mocked ( Foo ) . mockImplementation ( FooMock )
136+ vi . mocked ( Foo ) . mockImplementation ( Foo )
137+ }
138+ } )
139+
97140 test ( 'vi.fn and Mock type' , ( ) => {
98141 // use case from https://github.com/vitest-dev/vitest/issues/4723#issuecomment-1851034249
99142
0 commit comments