Unit-Tests in Keystone JS
Nach vielen nervigen Tests und viel Herumfummeln an Keystone.JS habe ich endlich ein ordentliches Unit-Testing-System zum Laufen gebracht.
Was benutze ich?
Wir brauchen nur zwei sehr nützliche Plugins für den Start.
Mocha: unser Test-Framework, das uns sagt, was besteht und was durchfällt Chai: unsere Assertion-Bibliothek, mit der wir Tests schreiben können Wie funktioniert das?
In unserer package.json haben wir ein Test-Skript ergänzt, das Mocha aufsetzt.
"scripts": {
"start": "node keystone.js",
"test": "./node_modules/.bin/mocha tests/init.js tests/unit/**"
}
Das heißt: Wenn wir npm test ausführen (oder in unserem Fall CircleCI), starten wir automatisch den Mocha-Testlauf und arbeiten unsere Assertions ab.
Unser init.js-Skript richtet nur die Umgebung ein und bereitet alles vor, was wir zum Testen brauchen.
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();
Danach können wir Tests in unser Verzeichnis /test/unit/ legen.
In meinem Projekt habe ich diese Ordnerstruktur:
/test/unit/
- models
- routes
- views
Im Mittelpunkt der Tests steht das Model. Weil wir Mongo benutzen, laufen unsere Tests mit einer Live-Verbindung zur Datenbank.
Hier ein Beispiel für einen 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();
});
});
Hoffentlich hilft dir das bei deinem eigenen Projekt. Kommentiere gern, wenn du Schwierigkeiten hast, ich versuche dann, mit Antworten zu helfen.
P.S. Danke an Prism.js fürs Syntax-Highlighting! Ich finde, es macht das alles viel leichter lesbar.