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(), fixtures.foo.bar );

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:

//main_test.js
'use strict';

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

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

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!

About these ads
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

Join 534 other followers

%d bloggers like this: