Zum Hauptinhalt springen
Version: 30.0

Modul-Mocks umgehen

Inoffizielle Beta-Übersetzung

Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →

Mit Jest können Sie ganze Module in Ihren Tests mocken, was nützlich ist, um zu überprüfen, ob Ihr Code Funktionen aus diesen Modulen korrekt aufruft. Manchmal möchten Sie jedoch Teile eines gemockten Moduls in Ihrer Testdatei verwenden. In diesem Fall benötigen Sie Zugriff auf die Originalimplementierung statt auf die gemockte Version.

Betrachten wir die Erstellung eines Testfalls für diese createUser-Funktion:

createUser.js
import fetch from 'node-fetch';

export const createUser = async () => {
const response = await fetch('https://website.com/users', {method: 'POST'});
const userId = await response.text();
return userId;
};

Ihr Test sollte die fetch-Funktion mocken, um sicherzustellen, dass sie aufgerufen wird, ohne tatsächlich Netzwerkanfragen durchzuführen. Allerdings müssen Sie auch den Rückgabewert von fetch mit einem Response-Objekt mocken (eingewickelt in ein Promise), da unsere Funktion dies verwendet, um die ID des erstellten Benutzers abzurufen. Sie könnten zunächst versuchen, einen Test wie diesen zu schreiben:

jest.mock('node-fetch');

import fetch, {Response} from 'node-fetch';
import {createUser} from './createUser';

test('createUser calls fetch with the right args and returns the user id', async () => {
fetch.mockReturnValue(Promise.resolve(new Response('4')));

const userId = await createUser();

expect(fetch).toHaveBeenCalledTimes(1);
expect(fetch).toHaveBeenCalledWith('https://website.com/users', {
method: 'POST',
});
expect(userId).toBe('4');
});

Wenn Sie diesen Test ausführen, würden Sie jedoch feststellen, dass die createUser-Funktion mit folgendem Fehler scheitert: TypeError: response.text is not a function. Dies passiert, weil die von node-fetch importierte Response-Klasse durch den jest.mock-Aufruf am Anfang der Testdatei gemockt wurde und sich daher nicht mehr wie erwartet verhält.

Um solche Probleme zu lösen, bietet Jest den jest.requireActual-Helfer. Um den obigen Test funktionsfähig zu machen, nehmen Sie folgende Änderung an den Imports in der Testdatei vor:

// BEFORE
jest.mock('node-fetch');
import fetch, {Response} from 'node-fetch';
// AFTER
jest.mock('node-fetch');
import fetch from 'node-fetch';
const {Response} = jest.requireActual('node-fetch');

Dadurch kann Ihre Testdatei das tatsächliche Response-Objekt aus node-fetch importieren statt einer gemockten Version. Der Test wird nun korrekt bestehen.