DEV Community

jorcelinojunior
jorcelinojunior

Posted on

Jest e Redis (problema de testes unitários com cache do banco)

Problema com testes unitários (Jest) e cache do banco (Redis)

Fala galera, vou comentar sobre um problema, relativamente simples de resolver, que tive fazendo testes unitários (usando Jest) e com cache do banco (usando Redis).

De forma bem resumida o problema era que em alguns momentos um determinado teste passava e em outros momentos não. E se eu testasse de forma isolada também passada.

Erro, era esperado um array vazio para ‘companies’, mas estava sendo retornado valor.<br>

De cara deduzi que fosse o cache do Redis, pois era a única coisa nova e diferente do que eu já estava acostumado a fazer.

Logo pensei em algumas possíveis soluções:

  1. Trocar a ordem em que os testes eram declarados, logo a ordem de execução também seria alterada e os testes com o cache só viria a ser executados por último (isso funcionou mas não resolveu o problema na raiz)
  2. Outra ideia veio do Led, que sugeriu alterar o CPF (que faz parte do payload do UseCase em questão a ser testado) para um diferente do que já havia sido utilizado nos testes anteriores (funcionou mas também não resolveu o problema na raiz)
  3. Pesquisar um pouco mais e entender porque isso estava acontecendo (resolver o problema na raiz rsrs)

Então dando uma pesquisada no pai Google encontrei mais sobre o assunto. Descobri que era necessário destruir/resetar todos os mocks antes que um próximo teste fosse iniciado.

A solução mais simples e direta foi fazer o uso do 'resetAllMocks' dentro de um 'beforeEach' :

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

   it(should return ., async () => {
   // ...
   })
})
Enter fullscreen mode Exit fullscreen mode

*Poderia ter sido também um 'afterEach', surtiria o mesmo efeito.

Dessa forma tudo que havia sido salvo pelo Redis em cache num teste anterior não estaria mais disponível para o próximo teste, logo todos eles iriam rodar de forma "isolada" uns dos outros.

No final tudo deu certo:

Sucesso em todos os testes, mesmo rodando várias vezes.<br>

Uma observação, tentei usar 'jest.clearAllMocks()' mas não funcionou e ainda não sei porque, em breve pesquiso mais e se souber faço outro post aqui.*

Links que encontrei sobre o assunto:

Top comments (0)