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

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


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.


Since JavaScript is a dynamically typed language you can create mock objects and passing them to your controllers as follow:

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

If your controller needs a particular piece of data or functionality from your request or response object you'll need to provide such data or functionality in your mocks. For example,

var req = {};req.url = "http://google.com"; // fake the Urlvar res = {};res.write = function(chunk, encoding) {   // fake the write method };var next = function(err) {console.log('lala')}controller.get_user(req, res, next)


I would try using dupertest for this. It's a node module I created for the very purpose of easy controller testing without having to spin up a new server.

It keeps the familiar syntax of node modules like request or supertest, but again, without the need to spin up a server.

It runs a lot like Hector suggested above, but integrates with a test framework like Jasmine to feel a little more seamless.

An example relating to your question may look like:

request(controller.get_user)  .params({id: user_id})  .expect(user, done);

Or the more explicit longhand version:

request(controller.get_user)  .params({id: user_id})  .end(function(response) {    expect(response).toEqual(user);    done();  });

Note: the examples assume user_id and user are defined somewhere, and that the controller grabs and returns a user based on id.

Edit: reading your response to an answer above, I will admit the downside currently is that this module does not integrate a more robust mock request or response object by default. dupertest makes it super easy to extend and add properties to both req and res, but by default they are pretty bare.