Mock-Funktionen
Du kannst eine Mock-Funktion erstellen, um ihre Ausführung mit der Methode vi.fn zu überwachen. Wenn du eine Methode eines bereits erstellten Objekts überwachen möchtest, kannst du die Methode vi.spyOn verwenden:
import { vi } from 'vitest';
const fn = vi.fn();
fn('hello world');
fn.mock.calls[0] === ['hello world'];
const market = {
getApples: () => 100,
};
const getApplesSpy = vi.spyOn(market, 'getApples');
market.getApples();
getApplesSpy.mock.calls.length === 1;Verwende Spion-Assertions (zum Beispiel toHaveBeenCalled) auf expect, um das Ergebnis der Spionagefunktion zu überprüfen. Diese API-Referenz beschreibt die verfügbaren Eigenschaften und Methoden zur Manipulation des Spy-Verhaltens.
getMockName
Typ:
() => stringGibt den Namen zurück, der dem Mock mit der Methode
.mockName(name)zugewiesen wurde.
mockClear
Typ:
() => MockInstanceEntfernt alle Informationen über jeden Aufruf. Nach dem Aufruf geben
spy.mock.callsundspy.mock.resultsleere Arrays zurück. Dies ist hilfreich, wenn du den Spy zwischen verschiedenen Assertions zurücksetzen musst.Wenn diese Methode automatisch vor jedem Test aufgerufen werden soll, kannst du die Einstellung
clearMocksin der Konfiguration aktivieren.
mockName
Typ:
(name: string) => MockInstanceSetzt den internen Mock-Namen. Hilfreich, um festzustellen, welcher Mock die Assertion nicht bestanden hat.
mockImplementation
Typ:
(fn: Function) => MockInstanceErwartet eine Funktion, die als Implementierung für den Mock verwendet wird.
Zum Beispiel:
tsconst mockFn = vi.fn().mockImplementation(apples => apples + 1); // oder: vi.fn(apples => apples + 1); const NelliesBucket = mockFn(0); const BobsBucket = mockFn(1); NelliesBucket === 1; // true BobsBucket === 2; // true mockFn.mock.calls[0][0] === 0; // true mockFn.mock.calls[1][0] === 1; // true
mockImplementationOnce
Typ:
(fn: Function) => MockInstanceErwartet eine Funktion, die für einen einzelnen Aufruf der gemockten Funktion als Implementierung verwendet wird. Kann verkettet werden, sodass aufeinanderfolgende Funktionsaufrufe unterschiedliche Ergebnisse liefern.
tsconst myMockFn = vi .fn() .mockImplementationOnce(() => true) .mockImplementationOnce(() => false); myMockFn(); // true myMockFn(); // falseWenn der gemockten Funktion die Implementierungen ausgehen, wird die Standardimplementierung aufgerufen, die mit
vi.fn(() => defaultValue)oder.mockImplementation(() => defaultValue)festgelegt wurde, falls diese definiert wurden:tsconst myMockFn = vi .fn(() => 'default') .mockImplementationOnce(() => 'first call') .mockImplementationOnce(() => 'second call'); // 'first call', 'second call', 'default', 'default' console.log(myMockFn(), myMockFn(), myMockFn(), myMockFn());
withImplementation
Typ:
(fn: Function, callback: () => void) => MockInstanceTyp:
(fn: Function, callback: () => Promise<unknown>) => Promise<MockInstance>Überschreibt die ursprüngliche Mock-Implementierung temporär, während der Callback ausgeführt wird.
jsconst myMockFn = vi.fn(() => 'original'); myMockFn.withImplementation( () => 'temp', () => { myMockFn(); // 'temp' } ); myMockFn(); // 'original'Kann auch mit asynchronen Callbacks verwendet werden. Die Methode muss mit
awaitaufgerufen werden, um die ursprüngliche Implementierung nach dem Callback wieder zu verwenden.tstest('async callback', () => { const myMockFn = vi.fn(() => 'original'); // Wir erwarten diesen Aufruf, da der Callback asynchron ist await myMockFn.withImplementation( () => 'temp', async () => { myMockFn(); // 'temp' } ); myMockFn(); // 'original' });Außerdem hat sie Vorrang vor
mockImplementationOnce.
mockRejectedValue
Typ:
(value: any) => MockInstanceErwartet einen Wert, der als Promise verworfen wird, wenn die asynchrone Funktion aufgerufen wird.
tsconst asyncMock = vi.fn().mockRejectedValue(new Error('Async error')); await asyncMock(); // löst "Async error" aus
mockRejectedValueOnce
Typ:
(value: any) => MockInstanceErwartet einen Wert, der für einen einzelnen Aufruf der Mock-Funktion als Promise verworfen wird. Bei Verkettung verwirft jeder weitere Aufruf den übergebenen Wert.
tsconst asyncMock = vi .fn() .mockResolvedValueOnce('first call') .mockRejectedValueOnce(new Error('Async error')); await asyncMock(); // first call await asyncMock(); // löst "Async error" aus
mockReset
Typ:
() => MockInstanceFührt dieselbe Aktion wie
mockClearaus und setzt die interne Implementierung auf eine leere Funktion zurück (die bei Aufrufundefinedzurückgibt). Dies ist hilfreich, wenn du einen Mock vollständig in seinen ursprünglichen Zustand zurückversetzen möchtest.Wenn diese Methode automatisch vor jedem Test aufgerufen werden soll, kannst du die Einstellung
mockResetin der Konfiguration aktivieren.
mockRestore
Typ:
() => MockInstanceFührt dieselbe Aktion wie
mockResetaus und stellt die interne Implementierung auf die ursprüngliche Funktion wieder her.Beachte, dass das Wiederherstellen eines Mocks von
vi.fn()die Implementierung auf eine leere Funktion setzt, dieundefinedzurückgibt. Das Wiederherstellen vonvi.fn(impl)stellt die Implementierung aufimplwieder her.Wenn diese Methode automatisch vor jedem Test aufgerufen werden soll, kannst du die Einstellung
restoreMocksin der Konfiguration aktivieren.
mockResolvedValue
Typ:
(value: any) => MockInstanceErwartet einen Wert, der als Promise aufgelöst wird, wenn die asynchrone Funktion aufgerufen wird.
tsconst asyncMock = vi.fn().mockResolvedValue(43); await asyncMock(); // 43
mockResolvedValueOnce
Typ:
(value: any) => MockInstanceErwartet einen Wert, der für einen einzelnen Aufruf der Mock-Funktion als Promise aufgelöst wird. Bei Verkettung löst jeder weitere Aufruf den übergebenen Wert auf.
tsconst asyncMock = vi .fn() .mockResolvedValue('default') .mockResolvedValueOnce('first call') .mockResolvedValueOnce('second call'); await asyncMock(); // first call await asyncMock(); // second call await asyncMock(); // default await asyncMock(); // default
mockReturnThis
Typ:
() => MockInstanceSetzt die interne Implementierung so, dass der
this-Kontext zurückgegeben wird.
mockReturnValue
Typ:
(value: any) => MockInstanceErwartet einen Wert, der immer dann zurückgegeben wird, wenn die Mock-Funktion aufgerufen wird.
tsconst mock = vi.fn(); mock.mockReturnValue(42); mock(); // 42 mock.mockReturnValue(43); mock(); // 43
mockReturnValueOnce
Typ:
(value: any) => MockInstanceErwartet einen Wert, der für einen einzelnen Aufruf der Mock-Funktion zurückgegeben wird. Bei Verkettung gibt jeder aufeinanderfolgende Aufruf den übergebenen Wert zurück. Wenn alle
mockReturnValueOnce-Werte aufgebraucht sind, wird die Implementierung verwendet, die durchmockImplementationoder anderemockReturn*-Methoden angegeben wurde.tsconst myMockFn = vi .fn() .mockReturnValue('default') .mockReturnValueOnce('first call') .mockReturnValueOnce('second call'); // 'first call', 'second call', 'default', 'default' console.log(myMockFn(), myMockFn(), myMockFn(), myMockFn());
mock.calls
Dies ist ein Array, das alle Argumente für jeden Aufruf enthält. Jedes Element des Arrays repräsentiert die Argumente eines einzelnen Aufrufs.
const fn = vi.fn();
fn('arg1', 'arg2');
fn('arg3', 'arg4');
fn.mock.calls ===
[
['arg1', 'arg2'], // erster Aufruf
['arg3', 'arg4'], // zweiter Aufruf
];mock.lastCall
Dies enthält die Argumente des letzten Aufrufs. Wenn der Spy noch nicht aufgerufen wurde, wird undefined zurückgegeben.
mock.results
Dies ist ein Array, das alle Ergebnisse enthält, die von der Funktion zurückgegeben wurden. Jedes Element des Arrays ist ein Objekt mit den Eigenschaften type und value. Verfügbare Typen sind:
'return'- Funktion wurde ohne Fehler beendet und hat einen Wert zurückgegeben.'throw'- Funktion hat eine Ausnahme (Error) ausgelöst.
Die Eigenschaft value enthält den zurückgegebenen Wert oder die ausgelöste Ausnahme. Wenn die Funktion eine Promise zurückgegeben hat, wird die Eigenschaft value zu dem Wert, zu dem die Promise aufgelöst wurde, sobald sie aufgelöst ist.
const fn = vi.fn();
const result = fn(); // returned 'result'
try {
fn(); // threw Error
} catch {}
fn.mock.results ===
[
// first result
{
type: 'return',
value: 'result',
},
// last result
{
type: 'throw',
value: Error,
},
];mock.instances
Dies ist ein Array, das alle Instanzen enthält, die erstellt wurden, als der Mock mit dem Schlüsselwort new aufgerufen wurde. Beachte, dass dies der tatsächliche Kontext (this) der Funktion ist, nicht der Rückgabewert.
WARNING
Wenn ein Mock mit new MyClass() instanziiert wurde, ist mock.instances ein Array mit einem Element:
const MyClass = vi.fn();
const a = new MyClass();
MyClass.mock.instances[0] === a;Wenn ein Konstruktor einen Wert zurückgibt, befindet sich dieser nicht im instances-Array, sondern stattdessen in results:
const Spy = vi.fn(() => ({ method: vi.fn() }));
const a = new Spy();
Spy.mock.instances[0] !== a;
Spy.mock.results[0] === a;