¿Cómo realizar una prueba unitaria de un método que se conecta a mongo, sin conectarse realmente a mongo?

Estoy tratando de escribir una prueba para probar un método que se conecta a mongo, pero en realidad no quiero tener que ejecutar Mongo y hacer una conexión para que mis pruebas se pasen con éxito.

Aquí está mi prueba actual, que tiene éxito cuando mi daemon mongo se está ejecutando.

describe('with a valid mongo string parameter', function() { it('should return a rejected promise', function(done) { var con = mongoFactory.getConnection('mongodb://localhost:27017'); expect(con).to.be.fulfilled; done(); }); }); 

Código mongoFactory.getConnection:

 getConnection: function getConnection(connectionString) { // do stuff here // Initialize connection once MongoClient.connect(connectionString, function(err, database) { if (err) { def.reject(err); } def.resolve(database); }); return def.promise; } 

Hay un par de respuestas de SO relacionadas con el código de prueba de unidad que utiliza MongoDB como almacén de datos:

  • Base de datos de burla en node.js?
  • Mock / Test Mongodb Database Node.js
  • MongoDB integrado al ejecutar pruebas de integración
  • Similares: clases de pruebas unitarias que tienen funcionalidad en línea

Intentaré consolidar estas soluciones.

Preámbulo

En primer lugar, debería querer que MongoDB se ejecute mientras realiza sus pruebas. El lenguaje de consulta de MongoDB es complejo, por lo que es necesario ejecutar consultas legítimas en una instancia estable de MongoDB para garantizar que sus consultas se ejecuten según lo planeado y que su aplicación responde correctamente a los resultados. Sin embargo, con esto en mente, nunca debe ejecutar sus pruebas en un sistema de producción, sino en un sistema periférico para su entorno de integración. Puede estar en la misma máquina que el software de su CI, o simplemente relativamente cerca de él (en términos de proceso, no necesariamente de red o geográficamente hablando).

Este ENV podría ser de baja huella y ejecutarse completamente en la memoria ( recurso 1 ) ( recurso 2 ), pero no necesariamente requeriría las mismas características de rendimiento que su ENV de producción. (De todos modos, si desea realizar una prueba de rendimiento, debe manejarse en un entorno separado de su CI).

Preparar

  • Instale un servicio mongod específicamente para CI. Si los conjuntos de réplicas y / o fragmentación son preocupantes (p. Ej., Preocupación de escritura, no uso de $isolated , etc.), es posible imitar un entorno agrupado ejecutando varias instancias mongod (1 config, datos 2×2 para shard + repl) y una instancia de mongos en la misma máquina con algunos scripts / ajustes init.d o algo así como docker.
  • Use configuraciones específicas del entorno dentro de su aplicación (ya sea incrustadas a través de archivos .json, o en algún lugar como / etc, /home/user/.your-app o similar). Su aplicación puede cargarlos en función de una variable de entorno de nodo como NODE_ENV=int . Dentro de estas configuraciones sus cadenas de conexión db serán diferentes. Si no está utilizando configuraciones específicas de env, comience a hacer esto como un medio para abstraer la configuración del tiempo de ejecución de la aplicación (es decir, “local”, “dev”, “int”, “pre”, “prod”, etc.). Puedo proporcionar una muestra a petición.
  • Incluya accesorios orientados a la prueba con su aplicación / conjunto de pruebas. Como se mencionó en una de las preguntas vinculadas, el controlador Node.js de MongoDB admite algunas bibliotecas auxiliares: mongodb-fixtures y node-database-cleaner . Los accesorios proporcionan un conjunto de datos consistente y de trabajo para la prueba: piense en ellos como una rutina de arranque.

Construcciones / Pruebas

  1. Limpie la base de datos asociada usando algo como node-database-cleaner .
  2. Rellene sus accesorios en la base de datos ahora vacía con la ayuda de mongodb-fixtures .
  3. Realiza tu construcción y prueba.
  4. Repetir.

Por otra parte…

Si aún decide que no ejecutar MongoDB es el enfoque correcto ( y usted no sería el único ), entonces abstraer las llamadas de su almacén de datos del controlador con un ORM es su mejor opción (para toda la aplicación, no solo las pruebas) . Por ejemplo, algo así como un model pretende ser independiente de la base de datos , aunque nunca lo he usado. Al utilizar este enfoque, aún necesitaría accesorios y configuraciones de entorno , sin embargo, no se le solicitará que instale MongoDB. La advertencia aquí es que usted está a merced del ORM que elija.

Usted podría intentar tingodb .

TingoDB es un sistema de archivos JavaScript en proceso incrustado o una base de datos en memoria compatible con MongoDB a nivel de API.