Skip to content

timjnh/knockers

Repository files navigation

knockers

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

Installation

npm install --save-dev knockers

Usage

Basic Usage

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

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

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

DELETE requests are pretty close as well

knockers()
    .delete('http://somefunwebsite/with/a/path')
    .reply(200, { stuff: 'and things' }, <optional headers>)
    .build();

Persisting requests

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();

Cleanup

afterEach(function() {
    knockers.cleanAll();
})

License

MIT