Nock is a great library for mocking out HTTP requests but I find the interface makes for some clunky tests, particularly for simple scenarios. Knocker builds on nock to streamline these cases and clean up your tests. It's very much in it's early stages. Contributions are welcome!
Improvements:
- Full urls for address specification rather than required separation of host and path
- Logging/buffering of requests so they can be evaluated in a natural order at the end of a test
- Promises to determine when requests have been fulfilled
npm install --save-dev knockers
it('should call my website', function(done) {
// knockers are created using a builder pattern
var knocker = knockers()
// the interface accepts full urls. no more parsing required
.get('http://somefunwebsite/with/a/path/and?a=query')
// where appropriate, interfaces match nock's
.reply(200, { stuff: 'and things' }, { 'aHeader': 'forTheResponse' })
.build();
doSomethingToKickOffAnHttpRequest();
// the received() method returns a promise that resolves after the first request matches the knocker
knocker.received()
.then(function() {
// requests made to the knocker are stored in .requests for more natural test ordering
expect(knocker.requests.length).toEqual(1);
})
.done(done);
});
GET requests are very simple
knockers()
.get('http://somefunwebsite/with/a/path/and?a=query')
.reply(200, { stuff: 'and things' }, { 'anOptional': 'hashOfHeaders' })
.build();
POST requests are pretty much the same
var knocker = knockers()
.post('http://somefunwebsite/with/a/path')
.reply(200, { ok: true }, <optional headers>)
.build();
Bodies are inserted into the request object for validation in the expectation portion of your test
expect(knocker.requests[0].body).toEqual({ expected: body });
DELETE requests are pretty close as well
knockers()
.delete('http://somefunwebsite/with/a/path')
.reply(200, { stuff: 'and things' }, <optional headers>)
.build();
Persisting requests will cause the same response to get returned for multiple calls to the same URL
knockers()
.get('http://somefunwebsite/with/a/path/and?a=query')
.reply(200, { stuff: 'and things' })
.persist()
.build();
afterEach(function() {
knockers.cleanAll();
})
MIT