• Stars
    star
    101
  • Rank 338,166 (Top 7 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 10 years ago
  • Updated over 8 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Simple HTTP Mocking Library

Shmock

Build Status

Express based http mocking library.

The reason for this to exist is because I believe that mocking functions to change their behavior is extremely horrible and prone to errors. Libraries like nock take this approach, and then there are a few cases where thing doesn't work. Maybe because of how http clients work, etc.

So this library provides a super nice API, like the one of superagent but it creates a real http server (using express). The nice thing about this is that you don't really care about the implementation, which http client is being used, or even if nodes native http api changes.

Make sure to view the test for examples.

Installation

$ npm install shmock

Usage

Initialize with or without port

var shmock = require('shmock');

var mock = shmock(); // will give some arbitrary port

var mock2 = shmock(9000); // will use port 9000

Define expectations

On http methods

mock.get("/foo").reply(200, "bar");

On http headers

mock.get("/foo").set("Authorization", "123456").reply(200, "bar");

Specifying response headers

mock.get("/foo").set("Authorization", "123456").reply(200, "bar", {"X-my-header", "My header value"});

On querystring parameters

mock.get("/foo").query("a=bi&c=d").reply(200, "bar");
mock.get("/foo").query({a: "b", c: "d"}).reply(200, "bar");

On request body

mock.post("/foo").send({a: "b"}).reply(200, "bar");
mock.post("/foo").send("123456").reply(200, "bar");

Add a delay to the reply

mock.get("/foo").delay(500).reply(200);

Make assertions on the handler

Check if expectation has been met

var handler = mock.get("/foo").reply(200);
...
...
handler.isDone.should.be.ok;
handler.done(); // Throws an error if isDone is false

Wait for expectation to be met

var handler = mock.get("/foo").reply(200);
...
...
handler.wait(function(err) {
  if(err) {
    // A default timeout of 2 seconds has passed and still the expectation hasn't been bet
  }
});

You can also specify a timeout in ms:

handler.wait(200, function(err) { ... });

Or if using mocha:

handler.wait(200, done);

Custom middleware

Custom middlewares can be injected into the Express stack in order to perform arbitrary manipulations on mock requests, for instance:

var shmock = shmock(9100, [function(req, res, next) {
  // do something with req/res then call next
  next();
}, function(req, res, next) {
  // do something else with the request object
  next()
}]);

As you would expect the arguments are the default arguments passed to request middleware by Express, so in order they are: req (the request object); res (the response object); and done (the callback).

License

MIT