Base de datos de burla en node.js?

¿Cómo me burlaría de la base de datos en mi aplicación node.js, que en este caso utiliza mongodb como backend para una API de REST de blog?

Claro, podría establecer la base de datos en una base de datos de testing específica, pero igual guardaría los datos y no solo probaría mi código, sino también la base de datos, así que en realidad no estoy haciendo pruebas de unidad sino pruebas de integración.
Entonces, ¿qué debe hacer uno? ¿Crear envoltorios de base de datos como una capa intermedia entre la aplicación y la base de datos y reemplazar el DAL cuando se realiza la prueba?

 // app.js var express = require('express'); app = express(), mongo = require('mongoskin'), db = mongo.db('localhost:27017/test?auto_reconnect'); app.get('/posts/:slug', function(req, res){ db.collection('posts').findOne({slug: req.params.slug}, function (err, post) { res.send(JSON.stringify(post), 200); }); }); app.listen(3000); 

 // test.js r = require('requestah')(3000); describe("Does some testing", function() { it("Fetches a blogpost by slug", function(done) { r.get("/posts/aslug", function(res) { expect(res.statusCode).to.equal(200); expect(JSON.parse(res.body)["title"]).to.not.equal(null); return done(); }); }); )); 

No creo que el código relacionado con la base de datos pueda probarse correctamente sin probarlo con el software de la base de datos. Esto se debe a que el código que está probando no es solo javascript sino también la cadena de consulta de la base de datos. Aunque en su caso las consultas parecen simples, no puede confiar en que siempre será así.

Por lo tanto, cualquier capa de emulación de base de datos implementará necesariamente toda la base de datos (quizás menos el almacenamiento en disco). Para entonces, terminará realizando pruebas de integración con el emulador de la base de datos aunque lo llame prueba de unidad. Otra desventaja es que el emulador de la base de datos puede terminar teniendo un conjunto diferente de errores en comparación con la base de datos y puede que tenga que codificar tanto para el emulador de la base de datos como para la base de datos (algo así como la situación con IE vs Firefox vs Chrome, etc.). ).

Por lo tanto, en mi opinión, la única forma de probar correctamente su código es interconectarlo con la base de datos real.

Hay una regla general cuando se trata de la burla que es

No te burles de nada que no tengas.

Si desea burlarse de la base de datos, ocúltela entre una capa de servicio abstraída y simule esa capa. A continuación, asegúrese de probar la integración de la capa de servicio real.

Personalmente, dejé de usar simulacros para realizar pruebas y las uso para el diseño de arriba a abajo, ayudándome a impulsar el desarrollo desde la parte superior hacia las capas de servicio burlándose de la parte superior a medida que avanzo y, finalmente, implementando esas capas y escribiendo pruebas de integración. Usados ​​como una herramienta de prueba, tienden a hacer que su prueba sea muy frágil y, en el peor de los casos, conduce a una divergencia entre el comportamiento real y el comportamiento mocking.

No estoy de acuerdo con la respuesta seleccionada u otras respuestas hasta el momento.

¿No sería asombroso si pudiera detectar los errores generados por los cambios caóticos y muchas veces desordenados realizados en los esquemas de base de datos y su código ANTES de que llegue al control de calidad? Apuesto a que la mayoría gritaría, ¡sí!

Ciertamente, usted puede y debe aislar y probar sus esquemas de base de datos. Y no lo hace en base a un emulador o una imagen pesada o una recreación de su DB y máquina. Esto es lo que SQLite es solo para un ejemplo. Se burla de él en función de una instancia liviana en memoria que se ejecuta y con datos estáticos que no cambian en la instancia de memoria, lo que significa que realmente está probando su DB de forma aislada y también puede confiar en sus pruebas. Y obviamente es rápido porque está en la memoria, un esqueleto, y se desecha al final de una prueba.

Así que sí, debería y debería probar el SCHEMA que se exporta a una instancia de memoria muy liviana de cualquier motor de DB / tiempo de ejecución que esté utilizando, y eso, junto con la adición de una cantidad muy pequeña de datos estáticos, se convierte en su base de datos aislada simulada.

Usted exporta sus esquemas reales de su base de datos real periódicamente (de manera automatizada) e importa / actualiza estos en su luz en la instancia de la base de datos de memoria antes de cada impulso a QA y sabrá al instante si los administradores de la base de datos u otros cambios realizados en la base de datos más recientes Los desarrolladores que han cambiado el esquema últimamente han roto alguna prueba.

Si bien aplaudo el esfuerzo por intentar responder lo mejor posible, votaría negativamente la respuesta actual si pudiera, pero soy nuevo y aún no he adquirido suficiente reputación para que pueda hacerlo aún.

En cuanto a la persona que respondió con el “no te burles de nada que no tienes”. Creo que quiso decir “no pruebes nada que no poseas”. ¡Pero sí te burlas de cosas que no tienes! ¡Porque esas son las cosas que no están bajo prueba y que necesitan ser aisladas!

Planeo compartir el CÓMO con usted y actualizaré esta publicación en un futuro futuro con un ejemplo real de código JS.

Esto es lo que hacen muchos equipos de prueba todo el tiempo. Solo tienes que entender el cómo.

El propósito de la burla es omitir la complejidad y el código propio de la prueba de unidad. Si desea escribir e2e tests, use la db.

Escribir código para configurar / desarmar una base de datos de prueba para la prueba de unidad es una deuda técnica e increíblemente insatisfactorio.

Hay bibliotecas simuladas en npm:

mongo – https://www.npmjs.com/package/mongomock

Mangosta – https://www.npmjs.com/package/mockgoose

Si esos no son compatibles con las funciones que necesita, entonces sí, puede que necesite usar el objeto real.

Mi enfoque preferido para probar el código de base de datos en cualquier idioma es acceder a Mongo a través de una abstracción del Repositorio (hay un ejemplo aquí http://iainjmitchell.com/blog/?p=884 ). Las implementaciones variarán en términos de la funcionalidad específica de la base de datos expuesta, pero al eliminar todo el código de Mongo de su propia lógica, estará en posición de realizar una prueba unitaria. Simplemente reemplace la implementación del repository de Mongo con una versión eliminada que es trivialmente fácil. Por ejemplo, simplemente almacene objetos en una colección simple de diccionarios en memoria.

Obtendrá los beneficios de la unidad de prueba de su propio código de esta manera sin las dependencias de base de datos, pero aún tendrá que hacer pruebas de integración contra la base de datos principal, ya que probablemente nunca podrá emular la idiosincrasia de la base de datos real como otros lo han hecho. dijo aquí El tipo de cosas que he encontrado son tan simples como la indexación en modo seguro y sin modo seguro. Específicamente, si tiene un índice único, su implementación de memoria ficticia podría cumplirlo en todos los casos, pero Mongo no lo hará sin el modo seguro.

Por lo tanto, aunque aún tendrá que hacer pruebas con la base de datos para algunas operaciones, ciertamente podrá probar su propia lógica de manera adecuada con una implementación de repository apagada.

Tuve este dilema y elegí trabajar con un DB de prueba y limpiarlo cada vez que comience la prueba. (cómo dejar todo: https://stackoverflow.com/a/25639377/378594 )

Con NPM puede incluso hacer un script de prueba que cree el archivo db y lo limpie después.