HTTP mocking service
Rodo can be used to create a real mocked API with an specific port and host.
The main difference with other HTTP mocking libraries like nock
is that Rodo creates a real HTTP server instead of overriding the behavior of Node HTTP objects.
npm install rodo
Writing a new mocked endpoint can be as easy as:
// Mocking API
const assert = require('assert');
const rodo = require('rodo');
const mockServer = rodo(8000);
const myCall = mockServer
.get('/foo')
.reply({ bar: 'baz' })
.withHeader('content-type', 'application/json');
// Action
const res = await fetch('http://localhost:8000/foo');
const json = await res.json();
// Assertions
assert.equal(json.bar, 'baz');
assert.equal(myCall.calls.length, 1);
To get started, you first need to instantiate the Rodo server doing the following:
const rodo = require('rodo');
const mockServer = rodo(8000);
Lets start building the filtering process for a specific request:
var myRequest = mockServer
.request()
.havingMethod('GET')
.havingPath('/foo');
You can do the same by doing:
var myRequest = mockServer.get('/foo');
Nice! Now Rodo will intercept every request to GET http://localhost:8000/foo
.
Now you want Rodo to return a specific response to that request:
var myResponse = myRequest
.reply()
.withHeader('content-type', 'application/json')
.withStatus(200)
.withBody({ bar: 'baz' });
You can do the same with:
var myResponse = myRequest
.reply({ bar: 'baz ' })
.withHeader('content-type', 'application/json');
Good! you can now check for the requests that were resolved with that response:
myResponse.calls; // [...calls]
You are all set, now Rodo will start intercepting all that requests and will return the response that you specify.
mockServer.clean();
mockServer.close();
Aside from port and hostname, when instatiating the Rodo server you can optionally pass an object with any of these extra options:
Multipart will be handled using the multiparty library. An example for rodo handling multipart is:
mock
.post('/foo')
.havingFields({ bar: 'baz' })
.havingFiles({
quux: (file) => file.originalFilename === 'my-file.txt'
})
.reply('quux');
Instead of using .withDelay
explicitly on each of your response methods, you can use this option to set a default delay that
will be automatically applied to all of them. And if you have a case that needs a different value, you can still use .withDelay
to overwrite the default.
port
: The port number of the server to be used by Rodohostname
: Hostname of the server, if neededoptions
: Options for the server, options is an object with props, i.e.:{ removeAfterUse: true }
removeAfterUse
: Remove call mocks after they are called
The filtering process for a specific request:
Specifies the HTTP method, should be one of GET, POST, PUT, DELETE, PATCH.
Specifies the body, can be an object or a string.
Specifies the fields, should be a key-value object.
Specifies the files, should be a key-value object, where value should be a function that validates every file configured.
Will intercept a specific path.
Will filter by query object params.
Will filter by header, only requests with the specified header and value will be intercepted.
The response for a specific request:
Will return specific header with the response.
Will return the specified body with the response.
Will return the content of the given file.
Will change the status code to the one specified.
Will delay the response.
Will add a middleware to the server.
Example:
mockServer.use(morgan('dev'));
MIT