← Todos os textos

Testes unitários no Keystone JS

Depois de muitos testes irritantes e de muito andar às voltas com o Keystone.JS, finalmente consegui montar um sistema a sério de testes unitários.

O que estou a usar?

Só precisamos de dois plugins super úteis para começar.

Mocha: a nossa framework de testes diz-nos o que passa e o que falha Chai: a nossa biblioteca de asserções, para podermos correr alguns testes Como funciona?

No nosso package.json acrescentámos um script de teste que configura o Mocha.

"scripts": {
    "start": "node keystone.js",
    "test": "./node_modules/.bin/mocha tests/init.js tests/unit/**"
}

Isto quer dizer que, quando corremos (ou, no nosso caso, quando o CircleCI corre) o npm test, entramos automaticamente no processo do Mocha e passamos pelas nossas asserções.

O nosso script init.js serve simplesmente para configurar o ambiente e deixar pronto tudo o que precisamos para correr os testes.

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();

Feito isto, podemos começar a acrescentar testes à nossa pasta /test/unit/.

No caso do nosso projeto, estou a trabalhar com esta estrutura de pastas:

/test/unit/
 - models
 - routes
 - views

A principal preocupação dos testes é o Modelo e, como usamos Mongo, os nossos testes vão correr com uma ligação real à base de dados.

Aqui está um exemplo de um teste:

/*
  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();
  });
});

Espero que isto te ajude no teu próprio projeto. Se tiveres dificuldades, comenta à vontade e eu faço por responder com as soluções!

P.S. Obrigado ao Prism.js pelo destaque de sintaxe! Parece-me que torna tudo isto muito mais fácil de ler.