Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat!: rename mock types to match jest's #1525

Merged
merged 3 commits into from Jun 24, 2022
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
46 changes: 33 additions & 13 deletions packages/vitest/src/integrations/spy.ts
Expand Up @@ -16,7 +16,7 @@ interface MockResultThrow {

type MockResult<T> = MockResultReturn<T> | MockResultThrow | MockResultIncomplete

export interface SpyContext<TArgs, TReturns> {
export interface MockContext<TArgs, TReturns> {
calls: TArgs[]
instances: TReturns[]
invocationCallOrder: number[]
Expand All @@ -37,11 +37,9 @@ type Classes<T> = {
}[keyof T] & (string | symbol)

export interface SpyInstance<TArgs extends any[] = any[], TReturns = any> {
(...args: TArgs): TReturns

getMockName(): string
mockName(n: string): this
mock: SpyContext<TArgs, TReturns>
mock: MockContext<TArgs, TReturns>
mockClear(): this
mockReset(): this
mockRestore(): void
Expand All @@ -57,20 +55,22 @@ export interface SpyInstance<TArgs extends any[] = any[], TReturns = any> {
mockRejectedValueOnce(obj: any): this
}

export interface SpyInstanceFn<TArgs extends any[] = any, TReturns = any> extends SpyInstance<TArgs, TReturns> {
(...args: TArgs): TReturns
export interface MockInstance<A extends any[] = any[], R = any> extends SpyInstance<A, R> {}

export interface Mock<TArgs extends any[] = any, TReturns = any> extends SpyInstance<TArgs, TReturns> {
new (...args: TArgs): TReturns
(...args: TArgs): TReturns
}

export type MaybeMockedConstructor<T> = T extends new (
...args: Array<any>
) => infer R
? SpyInstanceFn<ConstructorParameters<T>, R>
? Mock<ConstructorParameters<T>, R>
: T
export type MockedFunction<T extends Procedure> = SpyInstanceFn<Parameters<T>, ReturnType<T>> & {
export type MockedFunction<T extends Procedure> = Mock<Parameters<T>, ReturnType<T>> & {
[K in keyof T]: T[K];
}
export type MockedFunctionDeep<T extends Procedure> = SpyInstanceFn<Parameters<T>, ReturnType<T>> & MockedObjectDeep<T>
export type MockedFunctionDeep<T extends Procedure> = Mock<Parameters<T>, ReturnType<T>> & MockedObjectDeep<T>
export type MockedObject<T> = MaybeMockedConstructor<T> & {
[K in Methods<T>]: T[K] extends Procedure
? MockedFunction<T[K]>
Expand All @@ -94,6 +94,26 @@ export type MaybeMocked<T> = T extends Procedure
? MockedObject<T>
: T

interface Constructable {
new (...args: any[]): any
}

export type MockedClass<T extends Constructable> = MockInstance<
InstanceType<T>,
T extends new (...args: infer P) => any ? P : never
> & {
prototype: T extends { prototype: any } ? Mocked<T['prototype']> : never
} & T

export type Mocked<T> = {
[P in keyof T]: T[P] extends (...args: infer Args) => infer Returns
? MockInstance<Args, Returns>
: T[P] extends Constructable
? MockedClass<T[P]>
: T[P]
} &
T

export type EnhancedSpy<TArgs extends any[] = any[], TReturns = any> = SpyInstance<TArgs, TReturns> & SpyImpl<TArgs, TReturns>

export const spies = new Set<SpyInstance>()
Expand Down Expand Up @@ -244,12 +264,12 @@ function enhanceSpy<TArgs extends any[], TReturns>(
return stub as any
}

export function fn<TArgs extends any[] = any[], R = any>(): SpyInstanceFn<TArgs, R>
export function fn<TArgs extends any[] = any[], R = any>(): Mock<TArgs, R>
export function fn<TArgs extends any[] = any[], R = any>(
implementation: (...args: TArgs) => R
): SpyInstanceFn<TArgs, R>
): Mock<TArgs, R>
export function fn<TArgs extends any[] = any[], R = any>(
implementation?: (...args: TArgs) => R,
): SpyInstanceFn<TArgs, R> {
return enhanceSpy(tinyspy.spyOn({ fn: implementation || (() => {}) }, 'fn')) as unknown as SpyInstanceFn
): Mock<TArgs, R> {
return enhanceSpy(tinyspy.spyOn({ fn: implementation || (() => {}) }, 'fn')) as unknown as Mock
}
7 changes: 5 additions & 2 deletions packages/vitest/src/types/index.ts
Expand Up @@ -14,6 +14,9 @@ export type {
MockedFunction,
MockedObject,
SpyInstance,
SpyInstanceFn,
SpyContext,
MockInstance,
Mock,
MockContext,
Mocked,
MockedClass,
} from '../integrations/spy'