unitarios unitarias tutorial test pruebas node español automatizadas javascript node.js unit-testing express chai

javascript - unitarias - qunit



Cómo realizar una prueba unitaria de las rutas del router. (3)

Soy nuevo en Node and Express y estoy tratando de probar mis rutas / controladores. He separado mis rutas de mis controladores. ¿Cómo hago para probar mis rutas?

config / express.js

var app = express(); // middleware, etc var router = require(''../app/router'')(app);

aplicación / enrutador / index.js

module.exports = function(app) { app.use(''/api/books'', require(''./routes/books'')); };

aplicación / enrutador / rutas / books.js

var controller = require(''../../api/controllers/books''); var express = require(''express''); var router = express.Router(); router.get(''/'', controller.index); module.exports = router;

app / api / controllers / books.js

// this is just an example controller exports.index = function(req, res) { return res.status(200).json(''ok''); };

aplicación / pruebas / api / rutas / books.test.js

var chai = require(''chai''); var should = chai.should(); var sinon = require(''sinon''); describe(''BookRoute'', function() { });


Código:

config / express.js

var app = express(); // middleware, etc var router = require(''../app/router'')(app); module.exports = app;

aplicación / pruebas / api / rutas / books.test.js

var chai = require(''chai''); var should = chai.should(); var sinon = require(''sinon''); var request = require(''supertest''); var app = require(''config/express''); describe(''BookRoute'', function() { request(app) .get(''/api/books'') .expect(''Content-Type'', /json/) .expect(''Content-Length'', ''4'') .expect(200, "ok") .end(function(err, res){ if (err) throw err; }); });

Consideraciones:

Si su servidor requiere un estado inicial al comienzo de un conjunto de pruebas (porque está ejecutando llamadas que mutan el estado del servidor), deberá escribir una función que devolverá una aplicación recién configurada y el comienzo de cada grupo de pruebas Hay una biblioteca NPM: https://github.com/bahmutov/really-need que le permitirá solicitar una versión de su servidor con una instancia reciente.


Encontré este blog increíblemente perspicaz al probar mis propios puntos finales de servidores.

En el blog aborda:

  • Cómo utilizar el supertest biblioteca de pruebas de punto final.

  • Cómo activar y desactivar mediante programación un servidor Express con sus rutas necesarias antes y después de cada prueba de punto final. (También explica por qué querrías hacer esto).

  • Cómo evitar un problema común, requiere el almacenamiento en caché de los módulos requeridos en las pruebas de su unidad, lo que lleva a consecuencias no deseadas.

Espero que esto ayude. Buena suerte y si tienes más preguntas, házmelo saber.


Esto es interesante porque ha separado sus controladores de sus enrutadores. El otro artículo de mencionado en los comentarios es una buena manera de probar sus controladores, creo. Lo que hay que tener en cuenta con las pruebas unitarias es qué está probando exactamente. No debería tener que escribir pruebas para probar la biblioteca Express porque, presumiblemente, tiene sus propias pruebas unitarias. Así que solo necesitas probar tus llamadas a la biblioteca. Entonces, para la ruta de los libros, solo necesitas probar esta línea de código:

router.get(''/'', controller.index);

Miré a mi alrededor para ver si había una forma obvia de obtener una lista de rutas de la biblioteca Express, pero no vi ninguna. Probablemente, solo puede mirar la propia biblioteca y revisar sus partes internas para ver si configura una ruta correctamente. Sin embargo, otra opción es imitarlo y simplemente verificar que lo estás llamando correctamente.

Esto se va a complicar bastante porque necesitas simular algunas partes fundamentales de Javascript para probar esta línea de código. Así es como lo hice:

describe(''BookRoute'', function() { it("should route / to books controller index", function() { var controller = require(''../../../api/controllers/books''); var orig_this = this; var orig_load = require(''module'')._load; var router = jasmine.createSpyObj(''Router'', [''get'']); var express = jasmine.createSpyObj(''express'', [''Router'']); express.Router.and.returnValues(router); spyOn(require(''module''), ''_load'').and.callFake(function() { if (arguments[0] == ''express'') { return express; } else { return orig_load.apply(orig_this, arguments); } }); require("../../../router/routes/books"); expect(router.get).toHaveBeenCalledWith(''/'', controller.index); }); });

Lo que está sucediendo aquí es que utilicé la función spyOn de Jasmine para espiar la función _load en module.js, que es la que maneja todas las llamadas requeridas. Esto es para que cuando necesitemos el enrutador de libros y las llamadas requieran (''express'') podamos devolver nuestro SpyObj express que creamos con jasmine.createSpyObj. Una vez que hayamos reemplazado Express con nuestro objeto espía, podemos hacer que devuelva nuestro enrutador SpyObj, que nos permitirá espiar a router.get. Luego podemos verificar que se llame con ''/'' y controller.index.

Esto probablemente podría convertirse en algún tipo de utilidad si quisiera usar esto mucho.

Por lo general, evito muchas de estas cosas utilizando un enfoque más orientado a objetos y, o bien estoy transmitiendo algún objeto a cualquier lugar del que me pueda burlar para realizar pruebas, o podría usar algún tipo de inyección de dependencia como los usos Angular.