Redis
 sql >> Base de données >  >> NoSQL >> Redis

Jest et Redis (problème de tests unitaires avec le cache de la base de données)

Problème avec les tests unitaires (Jest) et le cache de la base de données (Redis)

Salut les gars, je vais commenter un problème, relativement simple à résoudre, que j'ai eu en faisant des tests unitaires (avec Jest) et avec le cache bancaire (avec Redis).

En bref, le problème était qu'à certains moments un test donné réussissait et à d'autres non. Et si je le testais en isolement trop réussi.

J'ai immédiatement supposé que c'était le cache Redis, car c'était la seule chose nouvelle et différente de ce que j'avais l'habitude de faire.

Ensuite, j'ai pensé à quelques solutions possibles :

  1. Modifier l'ordre dans lequel les tests ont été déclarés, ainsi l'ordre d'exécution serait également modifié et les tests avec le cache ne seraient exécutés qu'en dernier (cela a fonctionné mais n'a pas résolu le problème à la racine)
  2. Une autre idée est venue de Led, qui a suggéré de changer le CPF (qui fait partie de la charge utile UseCase en question à tester) en un différent de celui qui avait déjà été utilisé dans les tests précédents (cela a fonctionné mais n'a pas non plus résolu le problème problème à la racine )
  3. Recherchez un peu plus et comprenez pourquoi cela se produisait (résolvez le problème à la racine lol)

Donc en faisant une recherche sur Google parent j'en ai trouvé plus sur le sujet. J'ai constaté qu'il était nécessaire de détruire/réinitialiser tous les mocks avant le début du test suivant.

La solution la plus simple et la plus directe consistait à utiliser 'resetAllMocks' dans un 'beforeEach' :

 describe(‘Check XPTO Use Case’, () => {
   beforeEach(() => {
     jest.resetAllMocks() // dessa forma aqui
   })

   it(‘should return ….’, async () => {
   // ...
   })
})

*Cela aurait pu aussi être un 'afterEach', cela aurait le même effet.

De cette façon, tout ce qui avait été mis en cache par Redis lors d'un test précédent ne serait plus disponible pour le test suivant, de sorte qu'ils fonctionneraient tous "isolés" les uns des autres.

Au final tout s'est bien passé :

Une remarque, j'ai essayé d'utiliser 'jest.clearAllMocks() ' mais ça n'a pas marché et je ne sais toujours pas pourquoi, bientôt je ferai d'autres recherches et si je le fais, je posterai un autre message ici.*

Liens trouvés sur le sujet :

  • 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