Estoy en el proceso de aprender Node.js y he estado jugando con Express . Realmente me gusta el marco; sin embargo, tengo problemas para averiguar cómo escribir una prueba de unidad / integración para una ruta.
Poder realizar pruebas unitarias de módulos simples es fácil y lo he estado haciendo con Mocha ; sin embargo, mis pruebas unitarias con Express fallan porque el objeto de respuesta que estoy pasando no retiene los valores.
Función de ruta bajo prueba (rutas / index.js):
exports.index = function(req, res){
res.render('index', { title: 'Express' })
};
Módulo de prueba unitaria:
var should = require("should")
, routes = require("../routes");
var request = {};
var response = {
viewName: ""
, data : {}
, render: function(view, viewData) {
viewName = view;
data = viewData;
}
};
describe("Routing", function(){
describe("Default Route", function(){
it("should provide the a title and the index view name", function(){
routes.index(request, response);
response.viewName.should.equal("index");
});
});
});
Cuando ejecuto esto, falla por "Error: fugas globales detectadas: viewName, datos".
¿Dónde voy mal para que esto funcione?
¿Existe una mejor manera de realizar una prueba unitaria de mi código en este nivel?
Actualización 1. Fragmento de código corregido ya que inicialmente olvidé "it ()".
Como otros han recomendado en los comentarios, parece que la forma canónica de probar los controladores Express es mediante supertest .
Una prueba de ejemplo podría verse así:
Ventaja: puedes probar toda tu pila de una sola vez.
Desventaja: se siente y actúa un poco como una prueba de integración.
fuente
integration
, y quizás las rutas de prueba deberían dejarse para las pruebas de integración. Quiero decir, la funcionalidad de las rutas que coinciden con sus devoluciones de llamada definidas presumiblemente ya está probada por express.js; cualquier lógica interna para obtener el resultado final de una ruta, idealmente debería modularizarse fuera de ella, y esos módulos deberían probarse unitariamente. Su interacción, es decir, la ruta, debe probarse por integración. ¿Estarías de acuerdo?Llegué a la conclusión de que la única forma de realizar pruebas unitarias de las aplicaciones express es mantener mucha separación entre los controladores de solicitudes y la lógica central.
Por lo tanto, la lógica de su aplicación debe estar en módulos separados que se puedan
require
probar por unidad y tener una dependencia mínima de las clases Express Request y Response como tales.Luego, en los controladores de solicitud, debe llamar a los métodos apropiados de sus clases lógicas centrales.
¡Daré un ejemplo una vez que haya terminado de reestructurar mi aplicación actual!
¿Supongo algo como esto? (Siéntase libre de bifurcar la esencia o comentar, todavía estoy explorando esto).
Editar
Aquí hay un pequeño ejemplo, en línea. Consulte la esencia para obtener un ejemplo más detallado.
fuente
La forma más fácil de probar HTTP con express es robar el ayudante http de TJ
Yo personalmente uso a su ayudante
Si desea probar específicamente su objeto de rutas, pase los simulacros correctos
fuente
si prueba unitaria con express 4, tenga en cuenta este ejemplo de gjohnson :
fuente
También me preguntaba esto, pero específicamente para pruebas unitarias y no pruebas de integración. Esto es lo que estoy haciendo ahora mismo
Donde el routerObj es justo
{router: expressRouter, path: '/api'}
. Luego cargo en subrouters convar loginRouterInfo = require('./login')(express.Router({mergeParams: true}));
y luego la aplicación express llama a una función init que toma el enrutador express como parámetro. El initRouter luego llamarouter.use(loginRouterInfo.path, loginRouterInfo.router);
para montar el subrouter.El subrouter se puede probar con:
fuente
Para lograr pruebas unitarias en lugar de pruebas de integración, me burlé del objeto de respuesta del controlador de solicitudes.
Luego, para lograr las pruebas de integración, puede simular su endpointHandler y llamar al endpoint con supertest .
fuente
En mi caso, lo único que quería probar es si se ha llamado al manejador derecho. Quería usar supertest para aprovechar la simplicidad de realizar las solicitudes al middleware de enrutamiento. Estoy usando TypeScript ay esta es la solución que funcionó para mí
Las rutas
Los exámenes
Tuve algunos problemas para que la burla funcionara. pero usar jest.doMock y el orden específico que ve en el ejemplo lo hace funcionar.
fuente