Échec aléatoire des tests de plaisanterie et de supertest Node.js

si longue histoire courte je développe RESTapi qui prend un titre de film sur la demande POST à ​​la route / movies, récupère les informations sur ce film depuis une API externe et enregistre cet object dans la firebase database. Lors du POST / des commentaires, vous ajoutez un commentaire à une collection différente, mais chaque commentaire a une propriété “movie_id” associée à un film.

C’est mon premier projet plus important alors j’essaie d’écrire des tests d’intégration. Tout est génial, du moins à mon avis, à l’exception de 3 cas de test étranges qui échouent juste de nulle part. Les tests peuvent passer 10 fois de suite, puis tout à coup ce minuteur bizarre apparaît et 3 cas échouent.

J’utilise le pilote natif mongodb, express et plaisanterie avec supertest pour tester, laisser tomber la firebase database de test BeforeAll et AfterEach, je ne sais pas du tout pourquoi.

Minuterie chose: entrez la description de l'image ici

Et après la timer, les tests ont échoué: entrez la description de l'image ici

Le code source complet est ici GITHUB

Autres cas ayant échoué: entrez la description de l'image ici entrez la description de l'image ici

Des idées, des conseils?

Le code semble renvoyer une entrée, alors que le test s’attend à zéro. Cela ressemble beaucoup à un problème d’indépendance de test: vos tests semblent dépendre les uns des autres (via la firebase database).

Je suppose qu’un test crée le film puis l’efface à nouveau. Lorsque tout fonctionne bien, le deuxième test ne trouve pas le film. Mais, dans certains cas inattendus (mauvais timing, ordre d’exécution différent, …), la firebase database n’est pas effacée assez rapidement et le second test trouve le film.

Donc, vous devriez travailler dur pour rendre vos tests indépendants. Ce n’est pas facile avec les tests intégrés, surtout lorsqu’ils impliquent une vraie firebase database.

Peut-être que vous pouvez créer des tests plus petits (tests unitaires, micro tests, …) pour atteindre l’indépendance. Si cela n’est pas possible, le test peut vérifier qu’il est une condition préalable (firebase database vide ou autre) et attendre qu’il soit rempli (ou jusqu’à l’expiration d’un délai).

La suppression de la firebase database dans BeforeAll et AfterEach peut ne pas suffire, car Jest exécute même vos tests en parallèle: Les tests d’un fichier sont-ils exécutés en parallèle dans Jest?

En outre, la suppression peut ne pas être une opération complètement synchrone et atomique, en particulier lorsque le pilote de firebase database contient une certaine mise en cache. Mais je ne connais pas assez mongodb et son intégration node.js pour en juger.