Omgå modulmocks
This page was AI-translated by PageTurner (beta). Not officially endorsed by the project. Found an error? Report issue →
Jest lar deg mocke hele moduler i testene dine, noe som er nyttig for å verifisere at koden din kaller modulens funksjoner korrekt. Men noen ganger trenger du å bruke deler av en mocket modul i din testfil, og da vil du ha tilgang til den opprinnelige implementasjonen heller enn en mocket versjon.
Tenk deg at du skal skrive en test for denne createUser-funksjonen:
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;
};
Testen din vil mocke fetch-funksjonen for å bekrefte at den kalles uten å faktisk gjøre nettverksforespørsler. Men du må også mocke returverdien til fetch med et Response-objekt (pakket i en Promise), siden funksjonen vår bruker dette til å hente den nye brukerens ID. Du kan derfor først prøve å skrive en test slik:
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');
});
Hvis du kjører denne testen, vil createUser-funksjonen feile med feilmeldingen: TypeError: response.text is not a function. Dette skjer fordi Response-klassen du importerte fra node-fetch er blitt mocket (takket være jest.mock-kallet øverst i testfilen) og ikke lenger oppfører seg som den skal.
For å løse slike problemer tilbyr Jest hjelpefunksjonen jest.requireActual. For å få testen til å fungere, gjør du følgende endring i importene i testfilen:
// 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');
Dette lar testfilen din importere det faktiske Response-objektet fra node-fetch, ikke en mocket versjon. Resultatet er at testen nå vil passere korrekt.