@types/sinon
Version:
TypeScript definitions for sinon
1,205 lines (1,157 loc) • 61.4 kB
TypeScript
import * as FakeTimers from "@sinonjs/fake-timers";
// sinon uses DOM dependencies which are absent in browser-less environment like node.js
// to avoid compiler errors this monkey patch is used
// see more details in https://github.com/DefinitelyTyped/DefinitelyTyped/issues/11351
interface Event {} // eslint-disable-line @typescript-eslint/no-empty-interface
interface Document {} // eslint-disable-line @typescript-eslint/no-empty-interface
declare namespace Sinon {
type MatchPartialArguments<T> = {
[K in keyof T]?: SinonMatcher | (T[K] extends object ? MatchPartialArguments<T[K]> : T[K]);
};
// TODO: Alias for backward compatibility, remove on next major release
type DeepPartialOrMatcher<T> = MatchPartialArguments<T>;
type MatchExactArguments<T> = {
[K in keyof T]: SinonMatcher | (T[K] extends object ? MatchExactArguments<T[K]> : T[K]);
};
// TODO: Alias for backward compatibility, remove on next major release
type MatchArguments<T> = MatchExactArguments<T>;
interface SinonSpyCallApi<TArgs extends readonly any[] = any[], TReturnValue = any> {
// Properties
/**
* Array of received arguments.
*/
args: TArgs;
// Methods
/**
* Returns true if the spy was called at least once with @param obj as this.
* calledOn also accepts a matcher spyCall.calledOn(sinon.match(fn)) (see matchers).
* @param obj
*/
calledOn(obj: any): boolean;
/**
* Returns true if spy was called at least once with the provided arguments.
* Can be used for partial matching, Sinon only checks the provided arguments against actual arguments,
* so a call that received the provided arguments (in the same spots) and possibly others as well will return true.
* @param args
*/
calledWith(...args: MatchPartialArguments<TArgs>): boolean;
/**
* Returns true if spy was called at least once with the provided arguments and no others.
*/
calledWithExactly(...args: MatchExactArguments<TArgs>): boolean;
/**
* Returns true if spy/stub was called the new operator.
* Beware that this is inferred based on the value of the this object and the spy function’s prototype,
* so it may give false positives if you actively return the right kind of object.
*/
calledWithNew(): boolean;
/**
* Returns true if spy was called at exactly once with the provided arguments.
* @param args
*/
calledOnceWith(...args: MatchPartialArguments<TArgs>): boolean;
calledOnceWithExactly(...args: MatchExactArguments<TArgs>): boolean;
/**
* Returns true if spy was called with matching arguments (and possibly others).
* This behaves the same as spy.calledWith(sinon.match(arg1), sinon.match(arg2), ...).
* @param args
*/
calledWithMatch(...args: MatchPartialArguments<TArgs>): boolean;
/**
* Returns true if call did not receive provided arguments.
* @param args
*/
notCalledWith(...args: MatchExactArguments<TArgs>): boolean;
/**
* Returns true if call did not receive matching arguments.
* This behaves the same as spyCall.notCalledWith(sinon.match(arg1), sinon.match(arg2), ...).
* @param args
*/
notCalledWithMatch(...args: MatchPartialArguments<TArgs>): boolean;
/**
* Returns true if spy returned the provided value at least once.
* Uses deep comparison for objects and arrays. Use spy.returned(sinon.match.same(obj)) for strict comparison (see matchers).
* @param value
*/
returned(value: TReturnValue | SinonMatcher): boolean;
/**
* Returns true if spy threw an exception at least once.
*/
threw(): boolean;
/**
* Returns true if spy threw an exception of the provided type at least once.
*/
threw(type: string): boolean;
/**
* Returns true if spy threw the provided exception object at least once.
*/
threw(obj: any): boolean;
/**
* Like yield, but with an explicit argument number specifying which callback to call.
* Useful if a function is called with more than one callback, and simply calling the first callback is not desired.
* @param pos
*/
callArg(pos: number): unknown[];
callArgOn(pos: number, obj: any, ...args: any[]): unknown[];
/**
* Like callArg, but with arguments.
*/
callArgWith(pos: number, ...args: any[]): unknown[];
callArgOnWith(pos: number, obj: any, ...args: any[]): unknown[];
/**
* Invoke callbacks passed to the stub with the given arguments.
* If the stub was never called with a function argument, yield throws an error.
* Returns an Array with all callbacks return values in the order they were called, if no error is thrown.
* Also aliased as invokeCallback.
*/
yield(...args: any[]): unknown[];
yieldOn(obj: any, ...args: any[]): unknown[];
/**
* Invokes callbacks passed as a property of an object to the stub.
* Like yield, yieldTo grabs the first matching argument, finds the callback and calls it with the (optional) arguments.
*/
yieldTo(property: string, ...args: any[]): unknown[];
yieldToOn(property: string, obj: any, ...args: any[]): unknown[];
}
interface SinonSpyCall<TArgs extends readonly any[] = any[], TReturnValue = any>
extends SinonSpyCallApi<TArgs, TReturnValue>
{
/**
* The call’s this value.
*/
thisValue: any;
/**
* Exception thrown, if any.
*/
exception: any;
/**
* Return value.
*/
returnValue: TReturnValue;
/**
* This property is a convenience for a call’s callback.
* When the last argument in a call is a Function, then callback will reference that. Otherwise it will be undefined.
*/
callback: Function | undefined;
/**
* This property is a convenience for the first argument of the call.
*/
firstArg: any;
/**
* This property is a convenience for the last argument of the call.
*/
lastArg: any;
/**
* Returns true if the spy call occurred before another spy call.
* @param call
*/
calledBefore(call: SinonSpyCall<any>): boolean;
/**
* Returns true if the spy call occurred after another spy call.
* @param call
*/
calledAfter(call: SinonSpyCall<any>): boolean;
}
interface SinonSpy<TArgs extends readonly any[] = any[], TReturnValue = any> extends
Pick<
SinonSpyCallApi<TArgs, TReturnValue>,
Exclude<keyof SinonSpyCallApi<TArgs, TReturnValue>, "args">
>
{
// Properties
/**
* The number of recorded calls.
*/
callCount: number;
/**
* true if the spy was called at least once
*/
called: boolean;
/**
* true if the spy was not called
*/
notCalled: boolean;
/**
* true if spy was called exactly once
*/
calledOnce: boolean;
/**
* true if the spy was called exactly twice
*/
calledTwice: boolean;
/**
* true if the spy was called exactly thrice
*/
calledThrice: boolean;
/**
* The first call
*/
firstCall: SinonSpyCall<TArgs, TReturnValue>;
/**
* The second call
*/
secondCall: SinonSpyCall<TArgs, TReturnValue>;
/**
* The third call
*/
thirdCall: SinonSpyCall<TArgs, TReturnValue>;
/**
* The last call
*/
lastCall: SinonSpyCall<TArgs, TReturnValue>;
/**
* Array of this objects, spy.thisValues[0] is the this object for the first call.
*/
thisValues: any[];
/**
* Array of arguments received, spy.args[0] is an array of arguments received in the first call.
*/
args: TArgs[];
/**
* Array of exception objects thrown, spy.exceptions[0] is the exception thrown by the first call.
* If the call did not throw an error, the value at the call’s location in .exceptions will be undefined.
*/
exceptions: any[];
/**
* Array of return values, spy.returnValues[0] is the return value of the first call.
* If the call did not explicitly return a value, the value at the call’s location in .returnValues will be undefined.
*/
returnValues: TReturnValue[];
/**
* Holds a reference to the original method/function this stub has wrapped.
*/
wrappedMethod: (...args: TArgs) => TReturnValue;
// Methods
(...args: TArgs): TReturnValue;
/**
* Returns true if the spy was called before @param anotherSpy
* @param anotherSpy
*/
calledBefore(anotherSpy: SinonSpy<any>): boolean;
/**
* Returns true if the spy was called after @param anotherSpy
* @param anotherSpy
*/
calledAfter(anotherSpy: SinonSpy<any>): boolean;
/**
* Returns true if spy was called before @param anotherSpy, and no spy calls occurred between spy and @param anotherSpy.
* @param anotherSpy
*/
calledImmediatelyBefore(anotherSpy: SinonSpy<any>): boolean;
/**
* Returns true if spy was called after @param anotherSpy, and no spy calls occurred between @param anotherSpy and spy.
* @param anotherSpy
*/
calledImmediatelyAfter(anotherSpy: SinonSpy<any>): boolean;
/**
* Creates a spy that only records calls when the received arguments match those passed to withArgs.
* This is useful to be more expressive in your assertions, where you can access the spy with the same call.
* @param args Expected args
*/
withArgs(...args: MatchPartialArguments<TArgs>): SinonSpy<TArgs, TReturnValue>;
/**
* Returns true if the spy was always called with @param obj as this.
* @param obj
*/
alwaysCalledOn(obj: any): boolean;
/**
* Returns true if spy was always called with the provided arguments (and possibly others).
*/
alwaysCalledWith(...args: MatchExactArguments<TArgs>): boolean;
/**
* Returns true if spy was always called with the exact provided arguments.
* @param args
*/
alwaysCalledWithExactly(...args: MatchExactArguments<TArgs>): boolean;
/**
* Returns true if spy was always called with matching arguments (and possibly others).
* This behaves the same as spy.alwaysCalledWith(sinon.match(arg1), sinon.match(arg2), ...).
* @param args
*/
alwaysCalledWithMatch(...args: TArgs): boolean;
/**
* Returns true if the spy/stub was never called with the provided arguments.
* @param args
*/
neverCalledWith(...args: MatchExactArguments<TArgs>): boolean;
/**
* Returns true if the spy/stub was never called with matching arguments.
* This behaves the same as spy.neverCalledWith(sinon.match(arg1), sinon.match(arg2), ...).
* @param args
*/
neverCalledWithMatch(...args: TArgs): boolean;
/**
* Returns true if spy always threw an exception.
*/
alwaysThrew(): boolean;
/**
* Returns true if spy always threw an exception of the provided type.
*/
alwaysThrew(type: string): boolean;
/**
* Returns true if spy always threw the provided exception object.
*/
alwaysThrew(obj: any): boolean;
/**
* Returns true if spy always returned the provided value.
* @param obj
*/
alwaysReturned(obj: any): boolean;
/**
* Invoke callbacks passed to the stub with the given arguments.
* If the stub was never called with a function argument, yield throws an error.
* Returns an Array with all callbacks return values in the order they were called, if no error is thrown.
*/
invokeCallback(...args: TArgs): void;
/**
* Set the displayName of the spy or stub.
* @param name
*/
named(name: string): SinonSpy<TArgs, TReturnValue>;
/**
* Returns the nth call.
* Accessing individual calls helps with more detailed behavior verification when the spy is called more than once.
* @param n Zero-based index of the spy call.
*/
getCall(n: number): SinonSpyCall<TArgs, TReturnValue>;
/**
* Returns an Array of all calls recorded by the spy.
*/
getCalls(): Array<SinonSpyCall<TArgs, TReturnValue>>;
/**
* Resets the state of a spy.
*/
resetHistory(): void;
/**
* Returns the passed format string with the following replacements performed:
* * %n - the name of the spy "spy" by default)
* * %c - the number of times the spy was called, in words ("once", "twice", etc.)
* * %C - a list of string representations of the calls to the spy, with each call prefixed by a newline and four spaces
* * %t - a comma-delimited list of this values the spy was called on
* * %n - the formatted value of the nth argument passed to printf
* * %* - a comma-delimited list of the (non-format string) arguments passed to printf
* * %D - a multi-line list of the arguments received by all calls to the spy
* @param format
* @param args
*/
printf(format: string, ...args: any[]): string;
/**
* Replaces the spy with the original method. Only available if the spy replaced an existing method.
*/
restore(): void;
}
interface SinonSpyStatic {
/**
* Creates an anonymous function that records arguments, this value, exceptions and return values for all calls.
*/
(): SinonSpy;
/**
* Spies on the provided function
*/
<F extends (...args: any[]) => any>(func: F): SinonSpy<Parameters<F>, ReturnType<F>>;
/**
* Spies on all the object’s methods.
*/
<T>(obj: T): SinonSpiedInstance<T>;
/**
* Creates a spy for object.method and replaces the original method with the spy.
* An exception is thrown if the property is not already a function.
* The spy acts exactly like the original method in all cases.
* The original method can be restored by calling object.method.restore().
* The returned spy is the function object which replaced the original method. spy === object.method.
*/
<T, K extends keyof T>(
obj: T,
method: K,
): T[K] extends (...args: infer TArgs) => infer TReturnValue ? SinonSpy<TArgs, TReturnValue>
: SinonSpy;
<T, K extends keyof T>(obj: T, method: K, types: Array<"get" | "set">): PropertyDescriptor & {
get: SinonSpy<[], T[K]>;
set: SinonSpy<[T[K]], void>;
};
}
type SinonSpiedInstance<T> = {
[P in keyof T]: SinonSpiedMember<T[P]>;
};
type SinonSpiedMember<T> = T extends (...args: infer TArgs) => infer TReturnValue ? SinonSpy<TArgs, TReturnValue>
: T;
interface SinonStub<TArgs extends readonly any[] = any[], TReturnValue = any>
extends SinonSpy<TArgs, TReturnValue>
{
/**
* Resets the stub’s behaviour to the default behaviour
* You can reset behaviour of all stubs using sinon.resetBehavior()
*/
resetBehavior(): void;
/**
* Resets both behaviour and history of the stub.
* This is equivalent to calling both stub.resetBehavior() and stub.resetHistory()
* Updated in sinon@2.0.0
* Since sinon@5.0.0
* As a convenience, you can apply stub.reset() to all stubs using sinon.reset()
*/
reset(): void;
/**
* Makes the stub return the provided @param obj value.
* @param obj
*/
returns(obj: TReturnValue): SinonStub<TArgs, TReturnValue>;
/**
* Causes the stub to return the argument at the provided @param index.
* stub.returnsArg(0); causes the stub to return the first argument.
* If the argument at the provided index is not available, prior to sinon@6.1.2, an undefined value will be returned;
* starting from sinon@6.1.2, a TypeError will be thrown.
* @param index
*/
returnsArg(index: number): SinonStub<TArgs, TReturnValue>;
/**
* Causes the stub to return its this value.
* Useful for stubbing jQuery-style fluent APIs.
*/
returnsThis(): SinonStub<TArgs, TReturnValue>;
/**
* Causes the stub to return a Promise which resolves to the provided value.
* When constructing the Promise, sinon uses the Promise.resolve method.
* You are responsible for providing a polyfill in environments which do not provide Promise.
* Since sinon@2.0.0
*/
resolves(
value?: TReturnValue extends PromiseLike<infer TResolveValue> ? TResolveValue : any,
): SinonStub<TArgs, TReturnValue>;
/**
* Causes the stub to return a Promise which resolves to the argument at the provided index.
* stub.resolvesArg(0); causes the stub to return a Promise which resolves to the first argument.
* If the argument at the provided index is not available, a TypeError will be thrown.
*/
resolvesArg(index: number): SinonStub<TArgs, TReturnValue>;
/**
* Causes the stub to return a Promise which resolves to its this value.
*/
resolvesThis(): SinonStub<TArgs, TReturnValue>;
/**
* Causes the stub to throw an exception (Error).
* @param type
*/
throws(type?: string): SinonStub<TArgs, TReturnValue>;
/**
* Causes the stub to throw the provided exception object.
*/
throws(obj: any): SinonStub<TArgs, TReturnValue>;
/**
* Causes the stub to throw the argument at the provided index.
* stub.throwsArg(0); causes the stub to throw the first argument as the exception.
* If the argument at the provided index is not available, a TypeError will be thrown.
* Since sinon@2.3.0
* @param index
*/
throwsArg(index: number): SinonStub<TArgs, TReturnValue>;
throwsException(type?: string): SinonStub<TArgs, TReturnValue>;
throwsException(obj: any): SinonStub<TArgs, TReturnValue>;
/**
* Causes the stub to return a Promise which rejects with an exception (Error).
* When constructing the Promise, sinon uses the Promise.reject method.
* You are responsible for providing a polyfill in environments which do not provide Promise.
* Since sinon@2.0.0
*/
rejects(): SinonStub<TArgs, TReturnValue>;
/**
* Causes the stub to return a Promise which rejects with an exception of the provided type.
* Since sinon@2.0.0
*/
rejects(errorType: string): SinonStub<TArgs, TReturnValue>;
/**
* Causes the stub to return a Promise which rejects with the provided exception object.
* Since sinon@2.0.0
*/
rejects(value: any): SinonStub<TArgs, TReturnValue>;
/**
* Causes the stub to call the argument at the provided index as a callback function.
* stub.callsArg(0); causes the stub to call the first argument as a callback.
* If the argument at the provided index is not available or is not a function, a TypeError will be thrown.
*/
callsArg(index: number): SinonStub<TArgs, TReturnValue>;
/**
* Causes the original method wrapped into the stub to be called when none of the conditional stubs are matched.
*/
callThrough(): SinonStub<TArgs, TReturnValue>;
/**
* Like stub.callsArg(index); but with an additional parameter to pass the this context.
* @param index
* @param context
*/
callsArgOn(index: number, context: any): SinonStub<TArgs, TReturnValue>;
/**
* Like callsArg, but with arguments to pass to the callback.
* @param index
* @param args
*/
callsArgWith(index: number, ...args: any[]): SinonStub<TArgs, TReturnValue>;
/**
* Like above but with an additional parameter to pass the this context.
* @param index
* @param context
* @param args
*/
callsArgOnWith(index: number, context: any, ...args: any[]): SinonStub<TArgs, TReturnValue>;
/**
* Same as their corresponding non-Async counterparts, but with callback being deferred at called after all instructions in the current call stack are processed.
* In Node environment the callback is deferred with process.nextTick.
* In a browser the callback is deferred with setTimeout(callback, 0).
* @param index
*/
callsArgAsync(index: number): SinonStub<TArgs, TReturnValue>;
/**
* Same as their corresponding non-Async counterparts, but with callback being deferred at called after all instructions in the current call stack are processed.
* In Node environment the callback is deferred with process.nextTick.
* In a browser the callback is deferred with setTimeout(callback, 0).
* @param index
* @param context
*/
callsArgOnAsync(index: number, context: any): SinonStub<TArgs, TReturnValue>;
/**
* Same as their corresponding non-Async counterparts, but with callback being deferred at called after all instructions in the current call stack are processed.
* In Node environment the callback is deferred with process.nextTick.
* In a browser the callback is deferred with setTimeout(callback, 0).
*/
callsArgWithAsync(index: number, ...args: any[]): SinonStub<TArgs, TReturnValue>;
/**
* Same as their corresponding non-Async counterparts, but with callback being deferred at called after all instructions in the current call stack are processed.
* In Node environment the callback is deferred with process.nextTick.
* In a browser the callback is deferred with setTimeout(callback, 0).
*/
callsArgOnWithAsync(index: number, context: any, ...args: any[]): SinonStub<TArgs, TReturnValue>;
/**
* Makes the stub call the provided @param func when invoked.
* @param func
*/
callsFake(func: (...args: TArgs) => TReturnValue): SinonStub<TArgs, TReturnValue>;
/**
* Replaces a new getter for this stub.
*/
get(func: () => any): SinonStub<TArgs, TReturnValue>;
/**
* Defines a new setter for this stub.
* @param func
*/
set(func: (v: any) => void): SinonStub<TArgs, TReturnValue>;
/**
* Defines the behavior of the stub on the @param n call. Useful for testing sequential interactions.
* There are methods onFirstCall, onSecondCall,onThirdCall to make stub definitions read more naturally.
* onCall can be combined with all of the behavior defining methods in this section. In particular, it can be used together with withArgs.
* @param n Zero-based index of the spy call.
*/
onCall(n: number): SinonStub<TArgs, TReturnValue>;
/**
* Alias for stub.onCall(0);
*/
onFirstCall(): SinonStub<TArgs, TReturnValue>;
/**
* Alias for stub.onCall(1);
*/
onSecondCall(): SinonStub<TArgs, TReturnValue>;
/**
* Alias for stub.onCall(2);
*/
onThirdCall(): SinonStub<TArgs, TReturnValue>;
/**
* Defines a new value for this stub.
* @param val
*/
value(val: any): SinonStub<TArgs, TReturnValue>;
/**
* Set the displayName of the spy or stub.
* @param name
*/
named(name: string): SinonStub<TArgs, TReturnValue>;
/**
* Similar to callsArg.
* Causes the stub to call the first callback it receives with the provided arguments (if any).
* If a method accepts more than one callback, you need to use callsArg to have the stub invoke other callbacks than the first one.
*/
yields(...args: any[]): SinonStub<TArgs, TReturnValue>;
/**
* Like above but with an additional parameter to pass the this context.
*/
yieldsOn(context: any, ...args: any[]): SinonStub<TArgs, TReturnValue>;
yieldsRight(...args: any[]): SinonStub<TArgs, TReturnValue>;
/**
* Causes the spy to invoke a callback passed as a property of an object to the spy.
* Like yields, yieldsTo grabs the first matching argument, finds the callback and calls it with the (optional) arguments.
* @param property
* @param args
*/
yieldsTo(property: string, ...args: any[]): SinonStub<TArgs, TReturnValue>;
/**
* Like above but with an additional parameter to pass the this context.
*/
yieldsToOn(property: string, context: any, ...args: any[]): SinonStub<TArgs, TReturnValue>;
/**
* Same as their corresponding non-Async counterparts, but with callback being deferred at called after all instructions in the current call stack are processed.
* In Node environment the callback is deferred with process.nextTick.
* In a browser the callback is deferred with setTimeout(callback, 0).
* @param args
*/
yieldsAsync(...args: any[]): SinonStub<TArgs, TReturnValue>;
/**
* Same as their corresponding non-Async counterparts, but with callback being deferred at called after all instructions in the current call stack are processed.
* In Node environment the callback is deferred with process.nextTick.
* In a browser the callback is deferred with setTimeout(callback, 0).
* @param context
* @param args
*/
yieldsOnAsync(context: any, ...args: any[]): SinonStub<TArgs, TReturnValue>;
/**
* Same as their corresponding non-Async counterparts, but with callback being deferred at called after all instructions in the current call stack are processed.
* In Node environment the callback is deferred with process.nextTick.
* In a browser the callback is deferred with setTimeout(callback, 0).
* @param property
* @param args
*/
yieldsToAsync(property: string, ...args: any[]): SinonStub<TArgs, TReturnValue>;
/**
* Same as their corresponding non-Async counterparts, but with callback being deferred at called after all instructions in the current call stack are processed.
* In Node environment the callback is deferred with process.nextTick.
* In a browser the callback is deferred with setTimeout(callback, 0).
* @param property
* @param context
* @param args
*/
yieldsToOnAsync(property: string, context: any, ...args: any[]): SinonStub<TArgs, TReturnValue>;
/**
* Stubs the method only for the provided arguments.
* This is useful to be more expressive in your assertions, where you can access the spy with the same call.
* It is also useful to create a stub that can act differently in response to different arguments.
* @param args
*/
withArgs(...args: MatchPartialArguments<TArgs>): SinonStub<TArgs, TReturnValue>;
}
interface SinonStubStatic {
/* tslint:disable:no-unnecessary-generics */
/**
* Creates an anonymous stub function
*/
<TArgs extends readonly any[] = any[], R = any>(): SinonStub<TArgs, R>;
/* tslint:enable:no-unnecessary-generics */
/**
* Stubs all the object’s methods.
* Note that it’s usually better practice to stub individual methods, particularly on objects that you don’t understand or control all the methods for (e.g. library dependencies).
* Stubbing individual methods tests intent more precisely and is less susceptible to unexpected behavior as the object’s code evolves.
* If you want to create a stub object of MyConstructor, but don’t want the constructor to be invoked, use this utility function.
*/
<T>(obj: T): SinonStubbedInstance<T>;
/**
* Replaces obj.method with a stub function.
* An exception is thrown if the property is not already a function.
* The original function can be restored by calling object.method.restore(); (or stub.restore();).
*/
<T, K extends keyof T>(obj: T, method: K): SinonStubbedFunction<T[K]>;
}
interface SinonExpectation extends SinonStub {
/**
* Specify the minimum amount of calls expected.
*/
atLeast(n: number): SinonExpectation;
/**
* Specify the maximum amount of calls expected.
* @param n
*/
atMost(n: number): SinonExpectation;
/**
* Expect the method to never be called.
*/
never(): SinonExpectation;
/**
* Expect the method to be called exactly once.
*/
once(): SinonExpectation;
/**
* Expect the method to be called exactly twice.
*/
twice(): SinonExpectation;
/**
* Expect the method to be called exactly thrice.
*/
thrice(): SinonExpectation;
/**
* Expect the method to be called exactly @param n times.
*/
exactly(n: number): SinonExpectation;
/**
* Expect the method to be called with the provided arguments and possibly others.
* An expectation instance only holds onto a single set of arguments specified with withArgs.
* Subsequent calls will overwrite the previously-specified set of arguments (even if they are different),
* so it is generally not intended that this method be invoked more than once per test case.
* @param args
*/
withArgs(...args: any[]): SinonExpectation;
/**
* Expect the method to be called with the provided arguments and no others.
* An expectation instance only holds onto a single set of arguments specified with withExactArgs.
* Subsequent calls will overwrite the previously-specified set of arguments (even if they are different),
* so it is generally not intended that this method be invoked more than once per test case.
* @param args
*/
withExactArgs(...args: any[]): SinonExpectation;
on(obj: any): SinonExpectation;
/**
* Verifies all expectations on the mock.
* If any expectation is not satisfied, an exception is thrown.
* Also restores the mocked methods.
*/
verify(): SinonExpectation;
/**
* Restores all mocked methods.
*/
restore(): void;
}
interface SinonExpectationStatic {
/**
* Creates an expectation without a mock object, basically an anonymous mock function.
* Method name is optional and is used in exception messages to make them more readable.
* @param methodName
*/
create(methodName?: string): SinonExpectation;
}
interface SinonMock {
/**
* Overrides obj.method with a mock function and returns it.
*/
expects(method: string): SinonExpectation;
/**
* Restores all mocked methods.
*/
restore(): void;
/**
* Verifies all expectations on the mock.
* If any expectation is not satisfied, an exception is thrown.
* Also restores the mocked methods.
*/
verify(): void;
}
interface SinonMockStatic {
(name?: string): SinonExpectation;
/**
* Creates a mock for the provided object.
* Does not change the object, but returns a mock object to set expectations on the object’s methods.
*/
(obj: any): SinonMock;
}
type SinonFakeTimers = FakeTimers.Clock & {
/**
* Restores the original clock
* Identical to uninstall()
*/
restore(): void;
};
interface SinonFakeUploadProgress {
eventListeners: {
progress: any[];
load: any[];
abort: any[];
error: any[];
};
addEventListener(event: string, listener: (e: Event) => any): void;
removeEventListener(event: string, listener: (e: Event) => any): void;
dispatchEvent(event: Event): void;
}
interface SinonExposeOptions {
prefix: string;
includeFail: boolean;
}
interface SinonAssert {
// Properties
/**
* Every assertion fails by calling this method.
* If your testing framework of choice looks for assertion errors by checking for a specific exception, you can override the `fail` method to do the right thing.
*/
fail(message?: string): void; // Overridable
/**
* Called every time assertion passes.
* Default implementation does nothing.
*/
pass(assertion: any): void; // Overridable
// Methods
/**
* Passes if spy was never called
* @param spy
*/
notCalled(spy: SinonSpy<any>): void;
/**
* Passes if spy was called at least once.
*/
called(spy: SinonSpy<any>): void;
/**
* Passes if spy was called once and only once.
*/
calledOnce(spy: SinonSpy<any>): void;
/**
* Passes if spy was called exactly twice.
*/
calledTwice(spy: SinonSpy<any>): void;
/**
* Passes if spy was called exactly three times.
*/
calledThrice(spy: SinonSpy<any>): void;
/**
* Passes if spy was called exactly num times.
*/
callCount(spy: SinonSpy<any>, count: number): void;
/**
* Passes if provided spies were called in the specified order.
* @param spies
*/
callOrder(...spies: Array<SinonSpy<any>>): void;
/**
* Passes if spy was ever called with obj as its this value.
* It’s possible to assert on a dedicated spy call: sinon.assert.calledOn(spy.firstCall, arg1, arg2, ...);.
*/
calledOn(spyOrSpyCall: SinonSpy<any> | SinonSpyCall<any>, obj: any): void;
/**
* Passes if spy was always called with obj as its this value.
*/
alwaysCalledOn(spy: SinonSpy<any>, obj: any): void;
/**
* Passes if spy was called with the provided arguments.
* It’s possible to assert on a dedicated spy call: sinon.assert.calledWith(spy.firstCall, arg1, arg2, ...);.
* @param spyOrSpyCall
* @param args
*/
calledWith<TArgs extends any[]>(
spyOrSpyCall: SinonSpy<TArgs> | SinonSpyCall<TArgs>,
...args: MatchPartialArguments<TArgs>
): void;
/**
* Passes if spy was always called with the provided arguments.
* @param spy
* @param args
*/
alwaysCalledWith<TArgs extends any[]>(spy: SinonSpy<TArgs>, ...args: MatchPartialArguments<TArgs>): void;
/**
* Passes if spy was never called with the provided arguments.
* @param spy
* @param args
*/
neverCalledWith<TArgs extends any[]>(spy: SinonSpy<TArgs>, ...args: MatchPartialArguments<TArgs>): void;
/**
* Passes if spy was called with the provided arguments and no others.
* It’s possible to assert on a dedicated spy call: sinon.assert.calledWithExactly(spy.getCall(1), arg1, arg2, ...);.
* @param spyOrSpyCall
* @param args
*/
calledWithExactly<TArgs extends any[]>(
spyOrSpyCall: SinonSpy<TArgs> | SinonSpyCall<TArgs>,
...args: MatchExactArguments<TArgs>
): void;
/**
* Passes if spy was called at exactly once with the provided arguments and no others.
* @param spyOrSpyCall
* @param args
*/
calledOnceWithExactly<TArgs extends any[]>(
spyOrSpyCall: SinonSpy<TArgs> | SinonSpyCall<TArgs>,
...args: MatchExactArguments<TArgs>
): void;
/**
* Passes if spy was always called with the provided arguments and no others.
*/
alwaysCalledWithExactly<TArgs extends any[]>(spy: SinonSpy<TArgs>, ...args: MatchExactArguments<TArgs>): void;
/**
* Passes if spy was called with matching arguments.
* This behaves the same way as sinon.assert.calledWith(spy, sinon.match(arg1), sinon.match(arg2), ...).
* It's possible to assert on a dedicated spy call: sinon.assert.calledWithMatch(spy.secondCall, arg1, arg2, ...);.
*/
calledWithMatch<TArgs extends any[]>(
spyOrSpyCall: SinonSpy<TArgs> | SinonSpyCall<TArgs>,
...args: MatchPartialArguments<TArgs>
): void;
/**
* Passes if spy was called once with matching arguments.
* This behaves the same way as calling both sinon.assert.calledOnce(spy) and
* sinon.assert.calledWithMatch(spy, ...).
*/
calledOnceWithMatch<TArgs extends any[]>(
spyOrSpyCall: SinonSpy<TArgs> | SinonSpyCall<TArgs>,
...args: MatchPartialArguments<TArgs>
): void;
/**
* Passes if spy was always called with matching arguments.
* This behaves the same way as sinon.assert.alwaysCalledWith(spy, sinon.match(arg1), sinon.match(arg2), ...).
*/
alwaysCalledWithMatch<TArgs extends any[]>(spy: SinonSpy<TArgs>, ...args: MatchPartialArguments<TArgs>): void;
/**
* Passes if spy was never called with matching arguments.
* This behaves the same way as sinon.assert.neverCalledWith(spy, sinon.match(arg1), sinon.match(arg2), ...).
* @param spy
* @param args
*/
neverCalledWithMatch<TArgs extends any[]>(spy: SinonSpy<TArgs>, ...args: MatchPartialArguments<TArgs>): void;
/**
* Passes if spy was called with the new operator.
* It’s possible to assert on a dedicated spy call: sinon.assert.calledWithNew(spy.secondCall, arg1, arg2, ...);.
* @param spyOrSpyCall
*/
calledWithNew(spyOrSpyCall: SinonSpy<any> | SinonSpyCall<any>): void;
/**
* Passes if spy threw any exception.
*/
threw(spyOrSpyCall: SinonSpy<any> | SinonSpyCall<any>): void;
/**
* Passes if spy threw the given exception.
* The exception is an actual object.
* It’s possible to assert on a dedicated spy call: sinon.assert.threw(spy.thirdCall, exception);.
*/
threw(spyOrSpyCall: SinonSpy<any> | SinonSpyCall<any>, exception: string): void;
/**
* Passes if spy threw the given exception.
* The exception is a String denoting its type.
* It’s possible to assert on a dedicated spy call: sinon.assert.threw(spy.thirdCall, exception);.
*/
threw(spyOrSpyCall: SinonSpy<any> | SinonSpyCall<any>, exception: any): void;
/**
* Like threw, only required for all calls to the spy.
*/
alwaysThrew(spy: SinonSpy<any>): void;
/**
* Like threw, only required for all calls to the spy.
*/
alwaysThrew(spy: SinonSpy<any>, exception: string): void;
/**
* Like threw, only required for all calls to the spy.
*/
alwaysThrew(spy: SinonSpy<any>, exception: any): void;
/**
* Uses sinon.match to test if the arguments can be considered a match.
*/
match(actual: any, expected: any): void;
/**
* Exposes assertions into another object, to better integrate with the test framework.
* For instance, JsTestDriver uses global assertions, and to make Sinon.JS assertions appear alongside them, you can do.
* @example sinon.assert.expose(this);
* This will give you assertCalled(spy),assertCallOrder(spy1, spy2, ...) and so on.
* The method accepts an optional options object with two options.
*/
expose(obj: any, options?: Partial<SinonExposeOptions>): void;
}
interface SinonMatcher {
/**
* All matchers implement and and or. This allows to logically combine mutliple matchers.
* The result is a new matchers that requires both (and) or one of the matchers (or) to return true.
* @example var stringOrNumber = sinon.match.string.or(sinon.match.number);
* var bookWithPages = sinon.match.instanceOf(Book).and(sinon.match.has("pages"));
*/
and(expr: SinonMatcher): SinonMatcher;
/**
* All matchers implement and and or. This allows to logically combine mutliple matchers.
* The result is a new matchers that requires both (and) or one of the matchers (or) to return true.
* @example var stringOrNumber = sinon.match.string.or(sinon.match.number);
* var bookWithPages = sinon.match.instanceOf(Book).and(sinon.match.has("pages"));
*/
or(expr: SinonMatcher): SinonMatcher;
test(val: any): boolean;
}
interface SinonArrayMatcher extends SinonMatcher {
/**
* Requires an Array to be deep equal another one.
*/
deepEquals(expected: any[]): SinonMatcher;
/**
* Requires an Array to start with the same values as another one.
*/
startsWith(expected: any[]): SinonMatcher;
/**
* Requires an Array to end with the same values as another one.
*/
endsWith(expected: any[]): SinonMatcher;
/**
* Requires an Array to contain each one of the values the given array has.
*/
contains(expected: any[]): SinonMatcher;
}
interface SimplifiedSet {
has(el: any): boolean;
}
interface SimplifiedMap extends SimplifiedSet {
get(key: any): any;
}
interface SinonMapMatcher extends SinonMatcher {
/**
* Requires a Map to be deep equal another one.
*/
deepEquals(expected: SimplifiedMap): SinonMatcher;
/**
* Requires a Map to contain each one of the items the given map has.
*/
contains(expected: SimplifiedMap): SinonMatcher;
}
interface SinonSetMatcher extends SinonMatcher {
/**
* Requires a Set to be deep equal another one.
*/
deepEquals(expected: SimplifiedSet): SinonMatcher;
/**
* Requires a Set to contain each one of the items the given set has.
*/
contains(expected: SimplifiedSet): SinonMatcher;
}
interface SinonMatch {
/**
* Requires the value to be == to the given number.
*/
(value: number): SinonMatcher;
/**
* Requires the value to be a string and have the expectation as a substring.
*/
(value: string): SinonMatcher;
/**
* Requires the value to be a string and match the given regular expression.
*/
(expr: RegExp): SinonMatcher;
/**
* See custom matchers.
*/
(callback: (value: any) => boolean, message?: string): SinonMatcher;
/**
* Requires the value to be not null or undefined and have at least the same properties as expectation.
* This supports nested matchers.
*/
(obj: object): SinonMatcher;
/**
* Matches anything.
*/
any: SinonMatcher;
/**
* Requires the value to be defined.
*/
defined: SinonMatcher;
/**
* Requires the value to be truthy.
*/
truthy: SinonMatcher;
/**
* Requires the value to be falsy.
*/
falsy: SinonMatcher;
/**
* Requires the value to be a Boolean
*/
bool: SinonMatcher;
/**
* Requires the value to be a Number.
*/
number: SinonMatcher;
/**
* Requires the value to be a String.
*/
string: SinonMatcher;
/**
* Requires the value to be an Object.
*/
object: SinonMatcher;
/**
* Requires the value to be a Function.
*/
func: SinonMatcher;
/**
* Requires the value to be a Map.
*/
map: SinonMapMatcher;
/**
* Requires the value to be a Set.
*/
set: SinonSetMatcher;
/**
* Requires the value to be an Array.
*/
array: SinonArrayMatcher;
/**
* Requires the value to be a regular expression.
*/
regexp: SinonMatcher;
/**
* Requires the value to be a Date object.
*/
date: SinonMatcher;
/**
* Requires the value to be a Symbol.
*/
symbol: SinonMatcher;
/**
* Requires the value to be in the specified array.
*/
in(allowed: any[]): SinonMatcher;
/**
* Requires the value to strictly equal ref.
*/
same(obj: any): SinonMatcher;
/**
* Requires the value to be of the given type, where type can be one of "undefined", "null", "boolean", "number", "string", "object", "function", "array", "regexp", "date" or "symbol".
*/
typeOf(type: string): SinonMatcher;
/**
* Requires the value to be an instance of the given type.
*/
instanceOf(type: any): SinonMatcher;
/**
* Requires the value to define the given property.
* The property might be inherited via the prototype chain.
* If the optional expectation is given, the value of the property is deeply compared with the expectation.
* The expectation can be another matcher.
* @param property
* @param expect
*/
has(property: string, expect?: any): SinonMatcher;
/**
* Same as sinon.match.has but the property must be defined by the value itself. Inherited properties are ignored.
* @param property
* @param expect
*/
hasOwn(property: string, expect?: any): SinonMatcher;
/**
* Requires the value to define the given propertyPath. Dot (prop.prop) and bracket (prop[0]) notations are supported as in Lodash.get.
* The propertyPath might be inherited via the prototype chain.
* If the optional expectation is given, the value at the propertyPath is deeply compared with the expectation.
* The expectation can be another matcher.
*/
hasNested(path: string, expect?: any): SinonMatcher;
/**
* Requires every element of an Array, Set or Map, or alternatively every value of an Object to match the given matcher.
*/
every(matcher: SinonMatcher): SinonMatcher;
/**
* Requires any element of an Array, Set or Map, or alternatively any value of an Object to match the given matcher.
*/
some(matcher: SinonMatcher): SinonMatcher;
}
interface SinonSandboxConfig {
/**
* The sandbox’s methods can be injected into another object for convenience.
* The injectInto configuration option can name an object to add properties to.
*/
injectInto: object | null;
/**
* Which properties to inject into the facade object. By default empty!
*/
properties: string[];
/**
* If set to true, the sandbox will have a clock property.
* You can optionally pass in a configuration object that follows the specification for fake timers, such as { toFake: ["setTimeout", "setInterval"] }.
*/
useFakeTimers: boolean | Partial<FakeTimers.FakeTimerInstallOpts>;
/**
* The assert options can help limit the amount of output produced by assert.fail
*/
assertOptions: {
shouldLimitAssertionLogs?: boolean;
assertionLogLimit?: number;
};
}
/**
* Stubbed type of an object with members replaced by stubs.
*
* @template TType Type being stubbed.
*/
type StubbableType<TType> = Function & { prototype: TType };
/**
* An instance of a stubbed object type with functions replaced by stubs.
*
* @template TType Object type being s