← Alle berichten

Unit testing in Keystone JS

Na veel vervelende tests en gerommel met Keystone.JS heb ik eindelijk een degelijk unittestsysteem draaiend.

Wat gebruik ik?

We hebben maar twee superhandige plugins nodig om te beginnen.

Mocha: ons testframework vertelt ons wat slaagt en wat faalt Chai: onze assertiebibliotheek, zodat we tests kunnen draaien Hoe werkt het?

In onze package.json hebben we een testscript toegevoegd dat Mocha opzet.

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

Dit betekent dat we, als we npm test draaien (of in ons geval als CircleCI het draait), automatisch het Mocha-testproces in gaan en onze assertions doorlopen.

Ons init.js-script dient alleen om de omgeving op te zetten en alles klaar te maken wat we nodig hebben om tests te draaien.

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

Zodra dat staat, kunnen we tests toevoegen aan onze map /test/unit/.

In ons project werk ik met deze mapstructuur:

/test/unit/
 - models
 - routes
 - views

De tests draaien vooral om het Model, en omdat we Mongo gebruiken, draaien onze tests met een live verbinding met de database.

Hier is een voorbeeld van een 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();
  });
});

Hopelijk helpt dit je met je eigen project. Reageer gerust als je ergens tegenaan loopt, dan probeer ik te antwoorden met oplossingen.

P.S. Dank aan Prism.js voor de syntax highlighting! Ik vind dat het alles een stuk leesbaarder maakt.