← Alle Beiträge

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.