Introducing 

Prezi AI.

Your new presentation assistant.

Refine, enhance, and tailor your content, source relevant images, and edit visuals quicker than ever before.

Loading…
Transcript

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

Bad Practice

var mocks = require('mocks');

var configLoader = mocks.loadFile('config.js', {

fs: mockFs

});

- Hard to re-instantiate the modules for each tests

- Hard to mock global objects

Pass your dependencies

function createLogger(Date, console) {

return {

log: function(msg) {

console.log({

timestamp: (new Date()).getTime(),

message: msg

});

}

};

}

Mock

Dummy

Simple placeholder object.

Behavior verifications and changeable outputs with own expectations.

Fake

your

dependencies

Spy

Fake

Exact implementation of an API, but simplified.

Behavior verifications by record calls.

Stub

Provides changeable outputs.

Mockist TDD

Classicist TDD

Deeper tests on wiring

Production like errors

Tested Middleware

Gets the utm_medium param

from the url, and rewrites

it to the session

Setup Test

Test Case

Setup Test

Test Case

More

individual test cases

Test the "Pure" function

I am not amused, lets separate!

Leads to

separation and

more functional like

modules

More simple "fake" objects are better

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

Learn more about creating dynamic, engaging presentations with Prezi