← Todos os textos

Testes unitários no Keystone JS

Depois de muitos testes irritantes e de muita mexida no Keystone.JS, finalmente consegui montar um sistema decente de testes unitários.

O que estou usando?

Só precisamos de dois plugins super úteis para começar.

Mocha: nosso framework de testes, que diz o que passa e o que falha Chai: nossa biblioteca de asserções, para rodar alguns testes Como funciona?

No nosso package.json adicionamos um script de teste que configura o Mocha.

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

Isso significa que, quando rodamos (ou, no nosso caso, o CircleCI roda) npm test, entramos automaticamente no processo do Mocha e passamos pelas nossas asserções.

Nosso script init.js serve só para configurar o ambiente e deixar pronto tudo de que precisamos para rodar 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 isso, podemos começar a adicionar testes ao nosso diretório /test/unit/.

No caso do nosso projeto, estou trabalhando com esta estrutura de pastas:

/test/unit/
 - models
 - routes
 - views

A preocupação principal dos testes é o Model, e como estamos usando Mongo, nossos testes rodam com uma conexão ao vivo com o banco de dados.

Aqui está um exemplo de 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 isso ajude no seu próprio projeto. Fique à vontade para comentar se tiver qualquer dificuldade, que eu me esforço para responder com as respostas!

P.S. Valeu ao Prism.js pelo destaque de sintaxe! Acho que deixa tudo muito mais fácil de ler.