Tests unitaires dans Keystone JS
Après pas mal d’essais agaçants et de bidouillages avec Keystone.JS, j’ai enfin réussi à mettre en place un vrai système de tests unitaires.
Qu’est-ce que j’utilise ?
Il suffit de deux plugins super utiles pour démarrer.
Mocha, notre framework de test, nous dit ce qui passe et ce qui échoue Chai, notre bibliothèque d’assertions, nous permet de lancer des tests Comment ça marche ?
Dans notre package.json, on a ajouté un script de test qui configure Mocha.
"scripts": {
"start": "node keystone.js",
"test": "./node_modules/.bin/mocha tests/init.js tests/unit/**"
}
Ça veut dire que quand on lance (ou, dans notre cas, que CircleCI lance) npm test, on entre automatiquement dans le processus de test de Mocha et on déroule nos assertions.
Notre script init.js sert simplement à préparer l’environnement et à mettre en place tout ce dont on a besoin pour lancer les 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();
Une fois ça fait, on peut ajouter des tests dans notre dossier /test/unit/.
Dans le cas de notre projet, je travaille avec cette structure de dossiers :
/test/unit/
- models
- routes
- views
La préoccupation principale des tests, c’est le modèle, et comme on utilise Mongo, nos tests tournent avec une connexion en direct à la base de données.
Voici un exemple 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();
});
});
J’espère que ça t’aidera pour ton propre projet. N’hésite pas à commenter si tu bloques quelque part, je ferai de mon mieux pour te répondre !
P.S. Merci à Prism.js pour la coloration syntaxique ! Je trouve que ça rend tout bien plus lisible.