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.