← Todos los artículos

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.