Vai al contenuto principale
{ "message": "Versione: Prossima", "description": "" }

Ignorare i mock dei moduli

Traduzione Beta Non Ufficiale

Questa pagina è stata tradotta da PageTurner AI (beta). Non ufficialmente approvata dal progetto. Hai trovato un errore? Segnala problema →

Jest ti permette di simulare interi moduli nei tuoi test, il che può essere utile per verificare se il tuo codice chiama correttamente le funzioni di quel modulo. Tuttavia, a volte potresti voler utilizzare parti di un modulo simulato nel tuo file di test, in tal caso vuoi accedere all'implementazione originale anziché a una versione mockata.

Considera di scrivere un caso di test per questa funzione createUser:

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;
};

Il tuo test dovrà simulare la funzione fetch per essere sicuri che venga chiamata senza effettivamente eseguire la richiesta di rete. Tuttavia, dovrai anche simulare il valore restituito da fetch con una Response (racchiusa in una Promise), poiché la nostra funzione la utilizza per ottenere l'ID dell'utente creato. Quindi potresti inizialmente provare a scrivere un test come questo:

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');
});

Tuttavia, eseguendo quel test scopriresti che la funzione createUser fallirebbe, generando l'errore: TypeError: response.text is not a function. Questo perché la classe Response importata da node-fetch è stata mockata (a causa della chiamata jest.mock in cima al file di test) e quindi non si comporta più come dovrebbe.

Per aggirare problemi come questo, Jest fornisce l'helper jest.requireActual. Per far funzionare il test precedente, apporta la seguente modifica alle importazioni nel file di test:

// 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');

Ciò consente al tuo file di test di importare l'effettivo oggetto Response da node-fetch, anziché una versione simulata. Significa che il test ora passerà correttamente.