/fakehr

XHR request interceptor for tests. Application and test framework agnostic.

Primary LanguageJavaScriptMIT LicenseMIT

fakehr Build Status

fakehr is a tiny (~50loc) library for intercepting ajax requests in the browser for testing purposes. It is application and test library agnostic. fakehr depends on FakeXMLHttpRequest.

Using

fakehr has a minimal public interface:

###fakehr.start() Momentarily replaces the native XMLHttpRequest object with a fake one that registers itself with fakehr when new requests are attempted. These requests will not make HTTP requests. Instead a response is triggered by the developer. These requests objects are provided by FakeXMLHttpRequest.

###fakehr.stop() Stops intercepting requests and restores the native XMLHttpRequest object.

###fakehr.requests An array of intercepted requests.

###fakehr.clear() Clears the array of intercepted requests. If response wasn't triggered on these requests, they will never complete.

###fakehr.reset() Clears the intercepted requests and restores the native XMLHttpRequest object.

###fakehr.match(httpMethod, url, [readyState]) Searches the intercepted requests for the first open (readyState of 1) request whose HTTP method and url match the passed arguments. Optionally you can provide a numeric readyState code value to search for requests in that state.

Why not Sinon.JS or something else?

Sinon.JS includes much more than just request mocking. I wanted a single purpose library. Most other HTTP mocking libraries take the approach of acting like a fake server where requests registered before a test runs and canned responses are triggered immediately when they occur. This makes it cumbersome to do things like

  • specify multiple responses to the similar requests in a specific order
  • control where in the flow of execution a response occurs (for testing behavior like loading screens)
  • control the response order and timing of multiple simultaneous requests
  • testing the effect of requests that fail entirely and are aborted by the browser

Test library integration

fakehr doesn't integrate with any specific testing framework, so does not include features like

  • failing a test if there are unhandled requests
  • failing a test if a request is made to an unknown url
  • framework-specific helpers or matchers
  • automatically starting before tests run
  • automatically resetting when tests complete

Instead, you should implement these features yourself. A very simple QUnit example:

module("testing something that makes requests", {
  setup: function(){
    fakehr.start();
  },
  teardown: function(){
    var requests = fakehr.requests;
    var request;

    for(var i = 0; i < requests.length; i++){
      request = requests[i];
      if(request.readyState !== 4) {
        fakehr.reset();
        throw("A "+ request.method +" request to "+ request.url +" was left unhandled!");
      }
    }

    fakehr.reset();
  }
});

Testing

Tests are written in QUnit and run through the Karma test runner.

Run with:

karma start

Todo

  • Replace and Restore ActiveX-based requests for IE