patternjavascriptMinor
Does this nodeunit test conform to best practices?
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,
My first refactoring was to extract the HTTP behavior into the
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
```
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
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
Look for
Edit I added a code example. I did not fully tested the code, but it's how it would look like.
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.