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

Comment tester unitairement une méthode qui se connecte à mongo, sans réellement se connecter à mongo ?

Il existe quelques réponses SO liées au code de test unitaire qui utilise MongoDB comme magasin de données :

  • Moquer la base de données dans node.js ?
  • Moquer/Tester la base de données Mongodb Node.js
  • MongoDB intégré lors de l'exécution de tests d'intégration
  • Similaire :Cours de tests unitaires dotés d'une fonctionnalité en ligne

Je vais essayer de consolider ces solutions.

Préambule

Avant tout, vous devriez voulez que MongoDB s'exécute pendant l'exécution de vos tests. Le langage de requête de MongoDB est complexe, il est donc nécessaire d'exécuter des requêtes légitimes sur une instance MongoDB stable pour garantir que vos requêtes s'exécutent comme prévu et que votre application répond correctement aux résultats. Dans cet esprit, cependant, vous ne devriez jamais exécutez vos tests sur un système de production, mais plutôt sur un système périphérique à votre environnement d'intégration. Cela peut être sur la même machine que votre logiciel CI, ou simplement relativement proche (en termes de processus, pas nécessairement de réseau ou géographiquement parlant).

Cette ENV pourrait être à faible encombrement et entièrement exécutée en mémoire (ressource 1) (ressource 2), mais ne nécessiterait pas nécessairement les mêmes caractéristiques de performances que votre ENV de production. (Si vous souhaitez tester les performances, cela doit de toute façon être géré dans un environnement distinct de votre CI.)

Configuration

  • Installer un mongod service spécifiquement pour CI. Si les ensembles de remplacement et/ou le sharding sont préoccupants (par exemple, problème d'écriture, pas d'utilisation de $isolated , etc.), il est possible d'imiter un environnement clusterisé en exécutant plusieurs mongod instances (1 configuration, 2x2 données pour shard+repl) et un mongos instance sur la même machine avec des scripts/tweaks init.d ou quelque chose comme docker.
  • Utiliser des configurations spécifiques à l'environnement dans votre application (soit intégrée via des fichiers .json, soit à un endroit comme /etc, /home/user/.your-app ou similaire). Votre application peut les charger en fonction d'une variable d'environnement de nœud comme NODE_ENV=int . Dans ces configurations, vos chaînes de connexion db seront différentes. Si vous n'êtes pas en utilisant des configurations spécifiques à env, commencez à le faire comme un moyen d'abstraire les paramètres d'exécution de l'application (c'est-à-dire "local", "dev", "int", "pre", "prod", etc.). Je peux fournir un échantillon sur demande.
  • Incluez des montages orientés test avec votre suite d'applications/tests. Comme mentionné dans l'une des questions liées, le pilote Node.js de MongoDB prend en charge certaines bibliothèques d'assistance :mongodb-fixtures et node-database-cleaner . Les luminaires fournissent un ensemble de données fonctionnel et cohérent pour les tests :considérez-les comme un bootstrap.

Constructions/Tests

  1. Nettoyez la base de données associée en utilisant quelque chose comme node-database-cleaner .
  2. Remplissez vos luminaires dans la base de données désormais vide à l'aide de mongodb-fixtures .
  3. Effectuez votre compilation et testez.
  4. Répéter.

D'un autre côté...

Si vous décidez toujours que non exécuter MongoDB est la bonne approche (et vous ne seriez pas le seul), puis extraire vos appels de magasin de données du pilote avec un ORM est votre meilleur pari (pour l'ensemble de l'application, pas seulement pour les tests). Par exemple, quelque chose comme model prétend être indépendant de la base de données, même si je ne l'ai jamais utilisé. En utilisant cette approche, vous auriez toujours besoin de fixations et configurations d'environnement , mais vous ne serez pas obligé d'installer MongoDB. La mise en garde ici est que vous êtes à la merci de l'ORM que vous choisissez.