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.