unit-testing - test - proxyquire
Burlarse de una dependencia en Nodo (4)
Puede usar una biblioteca de inyección de dependencia como nCore
Para ser honesto, la parte más difícil de esto es burlarse de la API mongoDB, que es compleja y no trivial. Estimo que me tomará alrededor de una semana burlarme de la mayoría de las API de Mongo que uso, así que solo pruebo una base de datos mongodb local en mi máquina (que siempre está en un estado extraño)
Luego, con la sintaxis específica de nCore
// myModule.js
module.exports = {
myMethod: function () {
this.mongo.doStuff(...)
},
expose: ["myMethod"]
};
// test-myModule.js
var module = require("myModule")
module.mongo = mongoMock
assert(module.myMethod() === ...)
Estoy en proceso de aprender Node.js y me pregunto cómo las personas se burlan de las dependencias en sus módulos cuando realizan pruebas unitarias.
Por ejemplo: tengo un módulo que abstrae mis llamadas MongoDB. Un módulo que usa este módulo puede comenzar algo como esto.
var myMongo = require("MyMongoModule");
// insert rest of the module here.
Quiero asegurarme de que pruebo dicho módulo de forma aislada y, al mismo tiempo, asegurarme de que mis pruebas no inserten registros / documentos en Mongo.
¿Hay algún módulo / paquete que pueda usar que los proxies require()
para poder inyectarlo en mis propios simulacros? ¿Cómo los demás normalmente abordan este problema?
Después de revisar la sugerencia de Ryanos y el paquete de Horaa sobre npm, descubrí este hilo en el grupo de Google que me apuntó hacia Sandboxed-Module.
Sandboxed-Module me permite inyectar / anular require () sin que tenga que exponer esas dependencias para las pruebas de mi unidad.
Todavía estoy preparado para otras sugerencias; sin embargo, Sandboxed-Module parece ajustarse a mis necesidades en este momento.
Se burla fácilmente requiriendo usando "a": https://npmjs.org/package/a
por ejemplo, se necesita simular (''./ foo'') en prueba unitaria:
var fakeFoo = {};
var expectRequire = require (''a''). expectRequire;
expectRequire (''./ foo) .return (fakeFoo);
// en sut:
var foo = require (''./ foo); // devuelve fakeFoo
Sobrescribir require
para inyectar sus burlas es una posible solución. Sin embargo, estoy de acuerdo con la opinión de Raynos:
Personalmente, considero que la metodología de sobreescribir requiere un archivo por archivo como un "hack feo" y prefiero obtener un DI adecuado. Sin embargo, es óptimo para burlar uno o dos módulos en una base de código existente sin reescribir el código para soporte DI.
Utilizar la inyección de dependencia adecuada no solo le ahorra un "hack feo" sino que también le permite aplicar casos de uso adicionales además de inyectar simulaciones. En producción, por ejemplo, puede crear instancias de conexiones a través de http y, en determinadas circunstancias, inyectar una implementación diferente para establecer una conexión a través de VPN.
Si quieres buscar un contenedor de inyección de dependencia, lee este excelente artículo y echa un vistazo a Fire Up! que implementé