HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavascriptMinor

Does this nodeunit test conform to best practices?

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
thisconformpracticestestnodeunitdoesbest

Problem

I have inherited a node-js project, and I am completely new to it. Fortunately, it is already covered by unit tests.

The class under test, FmsRescuers, has the responsibility of sending HTTP requests to a remote server.

My first refactoring was to extract the HTTP behavior into the HttpRequest class, to allow testing that an operation requests the correct url with the correct data, without actually performing the http request. The HttpRequest class did not previously exist.

I am looking for feedback on the unit test from a perspective of best practices. In particular, how do I best avoid the duplication of calling the checkIn function through the different tests?

```
require('../server/extensions');
var FmsRescuers = require('../server/fms_rescuers');
var Rescuer = require('./stubs/helper').Rescuer;

var requestedPath;
var requestedStationNumber;
var requestedRescuerNumber;
var httpRequest = {
post: function(path, requestData, callback) {
requestedPath = path;
requestedStationNumber = requestData.stationNumber;
requestedRescuerNumber = requestData.rescuerNumber;
callback('', 200);
}
};
var rescuers = new FmsRescuers(httpRequest);
var rescuer = new Rescuer(42, 'Name', new Date().addHours(-2).toTimeZonedString(), new Date().addHours(-1).toTimeZonedString());

exports.testCheckIn = {
setUp: function(callback) {
requestedPath = undefined;
requestedStationNumber = undefined;
requestedRescuerNumber = undefined;
callback();
},
'check in requests correct path' : function(test) {
rescuers.checkIn(rescuer, 123, 3, function(result, status) {
test.equal(requestedPath, '/attendance/checkin');
test.done();
});
},

'check in sends correct station number' : function(test) {
rescuers.checkIn(rescuer, 123, 3, function(result, status) {
test.equal(request

Solution

You could use sinon.js to have the power of spies, stubs and mocks. http://sinonjs.org/

That way you could create a stub of httpRequest.

Look for stub.yield([arg1, arg2, ...]).

Edit I added a code example. I did not fully tested the code, but it's how it would look like.

var sinon = require('sinon');
require('../server/extensions');
var FmsRescuers = require('../server/fms_rescuers');
var Rescuer = require('./stubs/helper').Rescuer;

var mockedHttpRequest;
var rescuers;
var rescuer;

exports.testCheckIn = {    
    setUp: function(done) {
        var httpRequest { post: function () {} };
        mockedHttpRequest = sinon.mock(httpRequest);            
        rescuers = new FmsRescuers(mockedHttpRequest);   
        rescuer = new Rescuer(42, 'Name', new Date().addHours(-2).toTimeZonedString(), new Date().addHours(-1).toTimeZonedString());

    },

    'check in requests correct path' : function(test) {
        var expectedPath = '/attendance/checkin'
        mockedHttpRequest
                .expects('post')
                .once()
                .withArgs(expectedPath)
                .yields('', 200);

        rescuers.checkIn(rescuer, 123, 3, function(result, status) {
            mockedHttpRequest.verify();
            test.equal(result, '');
            test.equal(status, 200);
            test.done();
        });
    },
};

Code Snippets

var sinon = require('sinon');
require('../server/extensions');
var FmsRescuers = require('../server/fms_rescuers');
var Rescuer = require('./stubs/helper').Rescuer;

var mockedHttpRequest;
var rescuers;
var rescuer;

exports.testCheckIn = {    
    setUp: function(done) {
        var httpRequest { post: function () {} };
        mockedHttpRequest = sinon.mock(httpRequest);            
        rescuers = new FmsRescuers(mockedHttpRequest);   
        rescuer = new Rescuer(42, 'Name', new Date().addHours(-2).toTimeZonedString(), new Date().addHours(-1).toTimeZonedString());

    },

    'check in requests correct path' : function(test) {
        var expectedPath = '/attendance/checkin'
        mockedHttpRequest
                .expects('post')
                .once()
                .withArgs(expectedPath)
                .yields('', 200);

        rescuers.checkIn(rescuer, 123, 3, function(result, status) {
            mockedHttpRequest.verify();
            test.equal(result, '');
            test.equal(status, 200);
            test.done();
        });
    },
};

Context

StackExchange Code Review Q#20379, answer score: 2

Revisions (0)

No revisions yet.