Tests unitarios en Keystone JS
Tras muchas pruebas pesadas y mucho trastear con Keystone.JS, por fin he conseguido montar un sistema de tests unitarios en condiciones.
¿Qué estoy usando?
Solo necesitamos dos plugins superútiles para empezar.
Mocha: nuestro framework de tests nos dirá qué pasa y qué falla Chai: nuestra librería de aserciones para poder ejecutar algunas pruebas ¿Cómo funciona?
En nuestro package.json hemos añadido un script de test que configura Mocha.
"scripts": {
"start": "node keystone.js",
"test": "./node_modules/.bin/mocha tests/init.js tests/unit/**"
}
Esto significa que cuando ejecutamos (o, en nuestro caso, cuando ejecuta CircleCI) npm test, entramos automáticamente en el proceso de Mocha y recorremos nuestras aserciones.
Nuestro script init.js solo sirve para preparar el entorno y dejar listo todo lo que necesitamos para ejecutar los tests.
process.env.NODE_ENV = process.env.NODE_ENV || 'test';
require('dotenv').load();
var keystone = require('keystone');
var chai = require('chai');
keystone.init({
name: 'YourExactProjectName',
's3 config': {}, //leave this here or stuff will break (magic)
});
keystone.import('../models');
chai.should();
Hecho esto, podemos empezar a añadir tests a nuestro directorio /test/unit/.
En el caso de nuestro proyecto, trabajo con esta estructura de carpetas:
/test/unit/
- models
- routes
- views
La prioridad de los tests es el modelo y, como usamos Mongo, nuestros tests se ejecutarán con una conexión real a la base de datos.
Este es un ejemplo de test:
/*
Post Unit Test
for Keystone.JS built-in Post Model
*/
var keystone = require('keystone');
var chai = require('chai');
var dbURI = 'mongodb://localhost/<< YOUR DB >>' || process.env.MONGO_URL;
// CHANGE THIS AS NEEDED
describe('Posts', function () {
beforeEach(function (done) {
if (keystone.mongoose.connection.db) return done();
console.log('Connecting to ' + dbURI);
keystone.mongoose.connect(dbURI, done);
});
it('should be a connection to Mongo', function (done) {
keystone.mongoose.connection.db.should.be.a('Object');
done();
});
it('should be a Mongoose Model', function (done) {
Post = keystone.list('Post');
Post.should.be.a('Object');
Post.should.have.property('model').be.a('Function');
Post.should.have.property('schema').be.a('Object');
done();
});
});
Ojalá esto te ayude con tu propio proyecto. Si tienes alguna dificultad, comenta y me esforzaré por responderte con las soluciones.
P. D.: ¡Gracias a Prism.js por el resaltado de sintaxis! Creo que hace todo esto mucho más fácil de leer.