Introducing
Your new presentation assistant.
Refine, enhance, and tailor your content, source relevant images, and edit visuals quicker than ever before.
Trending searches
it('should instantiate a logger', function() {
var dummyOptions = {
logLevel: 'warning',
type: 'file'
};
var logger = createLogger(dummyOptions);
expect(typeof logger).toBe('object');
});
it('should add timestamp to log message', function() {
function FakeDate() {}
FakeDate.prototype.getTime = function() {
return 12345;
}
var logMessage = createLogMessage('message', FakeDate);
expect(logMessage).toEqual({
message: 'message',
timestamp: 12345
});
});
it('should give back time difference', function() {
var time;
function StubDate() {}
StubDate.prototype.getTime = function() {
return time;
}
var timer = createTimer(StubDate);
time = 100;
timer.start();
time = 300;
timer.stop();
expect(timer.difference()).toBe(200);
});
it('should call console.info', function() {
var testConsole = {
info: sinon.spy()
};
var logger = createLogger(testConsole);
logger.info('message');
expect(testConsole.info.args).toBe(['message']);
});
it('should read config file', function() {
var mockFs = sinon.mock(fs);
var reader = configReader(mockFs);
mockFs.expects('readFileSync').
once().
withArgs('filename').
returns('{"conf": 1}');
var config = reader('filename');
mockFs.verify();
expect(config).toEqual({conf: 1});
});
function saveUtmInSession(req, res, next) {
var utm = req.session.utm;
req.session.utm = {
medium:
req.param('utm_medium') || utm.medium
};
return next();
}
var nextSpy = sinon.spy();
var req = {
session: {},
param: function() {}
};
var reqMock = sinon.mock(req);
it('should rewrite utm_medium to session', function() {
reqMock.expects('param').once().withArgs('utm_medium');
saveUtmInSession(req, null, nextSpy);
expect(nextSpy.calledOnce).toBe(true);
reqMock.verfiy();
});
var app = express();
var request = supertest(app);
var beforeSession, afterSession;
app.use(express.cookieParser('secret'));
app.use(express.cookieSession());
app.use(function beforeStub(req, res, next) {
req.sesssion = beforeSession;
next();
});
app.use(saveUtmInSession);
app.use(function afterStub(req, res, next) {
afterSession = req.session;
next();
});
it('should rewrite utm_medium to session', function(done) {
beforeSession = {
utm: {medium: 'pear'}
};
request.get('/?utm_medium=apple').end(function() {
expect(afterSession.utm.medium).toBe('apple');
done();
});
});
function getUtm(session, requestUtm) {
return {
medium: requestUtm || session.utm.medium
};
}
function saveUtmInSession(req, res, next) {
req.session.utm = getUtm(req.session, req.param('utm_medium'));
return next();
}
it('should return a rewritten utm tag', function() {
var oldSession = {
utm: {medium: 'pear'}
};
var requestUtm = 'apple';
var session = getUtm(oldSession, requestUtm);
expect(session).toEqual({
medium: 'apple'
});
});
TDD and Mocking on Node
Tamas Kokeny
@EggDice
Be aware!
This talk will contain
a lot of code!
-Unit testing
-Express
-Jasmine/Mocha
-Sinon.js
-Supertest
Managing dependencies in unit tests
Rewire your modules in the tests
var mocks = require('mocks');
var configLoader = mocks.loadFile('config.js', {
fs: mockFs
});
function createLogger(Date, console) {
return {
log: function(msg) {
console.log({
timestamp: (new Date()).getTime(),
message: msg
});
}
};
}
Simple placeholder object.
Behavior verifications and changeable outputs with own expectations.
Fake
your
dependencies
Exact implementation of an API, but simplified.
Behavior verifications by record calls.
Provides changeable outputs.
Gets the utm_medium param
from the url, and rewrites
it to the session
Q & A
Examples
https://github.com/EggDice/tdd-and-mocking-in-node-example
Sinon.js
http://sinonjs.org/
Mocha
http://visionmedia.github.io/mocha/
Supertest
https://github.com/visionmedia/supertest