Problema con gli unit test (Jest) e la cache del database (Redis)
Salve ragazzi, vado a commentare un problema, relativamente semplice da risolvere, che ho avuto facendo unit test (usando Jest) e con la cache della banca (usando Redis).
Insomma, il problema era che a volte un dato test passava e altre volte no. E se l'avessi testato anche in isolamento superato.
Ho subito pensato che fosse la cache Redis, poiché era l'unica cosa nuova e diversa da quella a cui ero abituato.
Ho subito pensato ad alcune possibili soluzioni:
- Cambia l'ordine in cui sono stati dichiarati i test, così anche l'ordine di esecuzione sarebbe cambiato e i test con la cache sarebbero stati eseguiti solo per ultimi (questo ha funzionato ma non ha risolto il problema alla radice)
- Un'altra idea è venuta da Led, che ha suggerito di cambiare il CPF (che fa parte del payload UseCase in questione da testare) con uno diverso da quello già utilizzato nei test precedenti (funzionava ma non risolveva nemmeno problema alla radice)
- Ricerca un po' di più e capisci perché ciò stava accadendo (risolvi il problema alla radice lol)
Quindi facendo una ricerca su Google genitore ho trovato di più sull'argomento. Ho scoperto che era necessario distruggere/reimpostare tutti i mock prima che iniziasse il test successivo.
La soluzione più semplice e diretta era utilizzare "resetAllMocks" all'interno di un "beforeEach":
describe(‘Check XPTO Use Case’, () => {
beforeEach(() => {
jest.resetAllMocks() // dessa forma aqui
})
it(‘should return ….’, async () => {
// ...
})
})
*Potrebbe anche essere un "afterEach", avrebbe lo stesso effetto.
In questo modo tutto ciò che era stato memorizzato nella cache da Redis in un test precedente non sarebbe più disponibile per il test successivo, quindi sarebbero stati tutti "isolati" l'uno dall'altro.
Alla fine tutto ha funzionato :
Una nota, ho provato a usare 'jest.clearAllMocks() ' ma non ha funzionato e ancora non so perché, presto farò ulteriori ricerche e se lo farò, posterò un altro post qui.*
Link che ho trovato sull'argomento:
- https://stackoverflow.com/questions/69869063/how-to-clean-up-reset-redis-mock-in-an-express-jest-test
- https://jestjs.io/pt-BR/docs/jest-object#jestresetallmocks