Problem mit Unit-Tests (Jest) und Datenbank-Cache (Redis)
Hey Leute, ich werde ein relativ einfach zu lösendes Problem kommentieren, das ich bei Unit-Tests (mit Jest) und mit dem Bank-Cache (mit Redis) hatte.
Kurz gesagt, das Problem bestand darin, dass ein bestimmter Test manchmal bestanden wurde und manchmal nicht. Was wäre, wenn ich es isoliert zu bestanden getestet hätte.
Ich nahm sofort an, dass es der Redis-Cache war, da er das einzige war, was neu und anders war als das, was ich gewohnt war.
Dann dachte ich an einige mögliche Lösungen:
- Ändere die Reihenfolge, in der die Tests deklariert wurden, sodass die Ausführungsreihenfolge ebenfalls geändert würde und die Tests mit dem Cache nur zuletzt ausgeführt würden (das funktionierte, löste aber nicht das Problem an der Wurzel)
- Eine andere Idee kam von Led, der vorschlug, den CPF (der Teil der zu testenden UseCase-Nutzlast ist) auf einen anderen zu ändern, als er bereits in früheren Tests verwendet wurde (es funktionierte, löste aber auch nicht das Problem an der Wurzel )
- Recherchieren Sie ein wenig mehr und verstehen Sie, warum dies passiert ist (lösen Sie das Problem an der Wurzel, lol)
Also habe ich bei einer Suche auf Google Parent mehr zu diesem Thema gefunden. Ich fand heraus, dass es notwendig war, alle Mocks zu zerstören/zurückzusetzen, bevor der nächste Test gestartet wurde.
Die einfachste und unkomplizierteste Lösung war die Verwendung von ‚resetAllMocks‘ in einem ‚beforeEach‘:
describe(‘Check XPTO Use Case’, () => {
beforeEach(() => {
jest.resetAllMocks() // dessa forma aqui
})
it(‘should return ….’, async () => {
// ...
})
})
*Könnte auch ein 'afterEach' gewesen sein, hätte den gleichen Effekt.
Auf diese Weise würde alles, was in einem vorherigen Test von Redis zwischengespeichert wurde, für den nächsten Test nicht mehr verfügbar sein, sodass sie alle "isoliert" voneinander laufen würden.
Am Ende hat alles geklappt :
Eine Anmerkung, ich habe versucht, 'jest.clearAllMocks() zu verwenden ', aber es hat nicht funktioniert und ich weiß immer noch nicht warum, bald werde ich mehr recherchieren und wenn ich es tue, werde ich hier einen weiteren Beitrag posten.*
Links, die ich zum Thema gefunden habe:
- 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