How to mock request and response in nodejs to test middleware/controllers?

potomok picture potomok · Jan 23, 2013 · Viewed 40.4k times · Source

My application has several layers: middleware, controllers, managers. Controllers interface is identical to middlewares one: (req, res, next).

So my question is: how can I test my controllers without starting the server and sending 'real' requests to localhost. What I want to do is to create request, response instances as nodejs does and then just call controllers method.

Something like this:

var req = new Request()
var res = new Response()
var next = function(err) {console.log('lala')}
controller.get_user(req, res, next)

Any advice is highly appreciated. Thanks!

P.S. the reason why I want to do this is that at the end I would like to test whether the response object contains correct variables for the jade views.

Answer

superluminary picture superluminary · Jun 30, 2015

There's a semi decent implementation at node-mocks-http

Require it:

var mocks = require('node-mocks-http');

you can then compose req and response objects:

req = mocks.createRequest();
res = mocks.createResponse();

You can then test your controller directly:

var demoController = require('demoController');
demoController.login(req, res);

assert.equal(res.json, {})

caveat

There is at time of writing an issue in this implementation to do with the event emitter not being fired.