Archive for April, 2014

Auto-loading test fixtures in node

Something which comes back time and again is the loading of test fixtures for my unit tests. This may involve a lot of boilerplate in my test files; a bunch of requires or fs.readFiles. There is however a very easy fix by using the splendid require-directory module.

As the description of the project says it …

recursively iterates over specified directory, requiring each file, and returning a nested hash structure containing those libraries.

I.e. it takes a directory, traverses its subdirectories and reads all of the files they contain and maps them to an object with the filenames as keys.

Tutorial files

I created a tutorial project with the completed files. The tutorial project already contains all dependency declarations, all you need to do is clone the repo and

$ npm install

when in the cloned repo directory.

Starting from scratch

However, if you’re starting from scratch you’ll need to install the require-directory module into your project first:

$ npm install require-directory

There are many projects with similar names, make sure you use require-directory, since that’s the one I’m interested in. Yeah, it’s a bit confusing that the project is named differently on github.

Let’s get started

Now let’s use it to load our fixtures.

For example if we got the following fixtures directory structure:

Accessing the fixtures

What we want is to be able to load all of these files into our tests at once and access them through an object.

E.g. in our tests we want to access the contents of foo/bar.json like this:

    test.deepEqual( main.awesome(), );

with fixtures being the object containing all of the loaded files.

Exposing the fixtures

In order to do this we need to create a fixtures/index.js file which uses node-require to load the files and exports them as an object. Like this:

//file: fixtures/index.js
var requireDirectory = require('require-directory');
module.exports = requireDirectory(module);

This file needs to reside at the root of the fixtures directory.

Using the fixtures

In our test file now we can require the fixtures directory itself:

var fixtures = require('./fixtures');

Et voila, you’re done: the fixtures object contains all files and their contents.

The full code of our test file:

'use strict';

var main = require( '../lib/main.js' );
var fixtures = require( './fixtures' );

exports.tutorialLoadFixtures = {
  'awesome' : function( test ){
    test.expect( 1 );
    test.deepEqual( main.awesome(),, 'should be "value: Awesome!"' );

Easy, isn’t it? Take a look at the tutorial project to see all the files.

Be sure to keep an eye on my blog next week, since I’ll be reviewing the “Getting started with Grunt” book by Packt!

%d bloggers like this: