If you want to persist Javascript objects (data) to a database using Node, then it is a good idea to test this mechanism is working. Below you will learn how to accomplish testing your data persistence mechanism. Sequelize, Nodeunit and Grunt are popular tools to accomplish this task. Sequelize is an Object Relational Mapper (ORM), Nodeunit is a unit testing framework and Grunt is a common test runner that will run all the tests you create.
A project containing the result of this tutorial is available at https://github.com/lakowske/sequelize-grunt-nodeunit-example
Getting Started
First, be sure you have installed Node and npm. Next, do the following:
Install grunt command line interface
sudo npm -g install grunt-cli
Now go to your project directory. If you don’t already have a project directory, create one. If you don’t have a package.json file, create a basic one using
npm init
Next add dependencies to your project
npm install sequelize --save
npm install sqlite3 --save
npm install nodeunit --save-dev
npm install grunt --save-dev
npm install grunt-contrib-nodeunit --save-dev
npm install async --save
npm install uuid --save
Create a Gruntfile.js configured to run nodeunit tests.
module.exports = function(grunt) {
// Project configuration.
grunt.initConfig({
nodeunit: {
all: ['./**/*Test.js']
}
});
// Load nodeunit task
grunt.loadNpmTasks('grunt-contrib-nodeunit');
};
Next I created a SequelizeDatabase.js implementation. It contains a function that returns a sequelize sqlite instance.
var Sequelize = require('Sequelize');
exports.testDB = function testDB() {
return new Sequelize('database', 'username', 'password', {
// sqlite! now!
dialect: 'sqlite',
// the storage engine for sqlite
// - default ':memory:'
storage: __dirname + '/database.sqlite'
});
}
I make the unit test SequelizeDatabaseTest.js.
var db = require('./SequelizeDatabase');
var uuid = require('uuid');
exports.testSequelize = function (test) {
var sequelize= db.testDB();
sequelize.query("DROP TABLE COMMANDLINES").success(function(myLines) {
console.log('drop table COMMANDLINES');
});
sequelize.query("CREATE TABLE IF NOT EXISTS COMMANDLINES (ID varchar(255), MYLINE TEXT)").success(function(myLines) {
console.log('create table COMMANDLINES');
});
// Generate a v1 (time-based) id
var id = uuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'
sequelize.query("INSERT INTO COMMANDLINES (ID, MYLINE) VALUES ('" + id + "', 'aline')").success(function(myLines){
console.log('insert ' + id + " into commandlines");
});
sequelize.query("SELECT * FROM COMMANDLINES").success(function(myLines) {
var cmdLine = myLines[0];
test.equal(id, cmdLine.ID,"should be " + id);
test.equal("aline", cmdLine.MYLINE,"should be aline");
console.log(cmdLine.ID);
console.log(cmdLine.MYLINE);
console.log(myLines);
test.done();
});
}
Finally, to establish the data persistence mechanism is working, run the unit test.
nodeunit SequelizeDatabaseTest.js
Or run all your tests using Grunt.
grunt nodeunit