/jasmine-fake-ajax

Fake Ajax to be used with the Jasmine BDD framework.

Primary LanguageJavaScript

Fake Ajax to be used with the Jasmine BDD framework.

Usage in a nutshell: you provide a context which is a list of mappings from an URL to succes data or error message. When the spec is run, fake ajax is called and the data you have supplied will be passed to the real system under test.

See spec/fake-ajax-spec.js for live specification.

Simplified:

describe('simple example', function() {
  it('just works', function() {
    fakeAjax({urls: {'/simple': {successData: 'y'}}});
    var result = 'x';
    $.get('/simple', function(data) {
      result = data;
    });
    expect(result).toEqual('y');
  });
});

You may inline the test data

fakeAjax({urls: {"/succeeds": {successData: "Jasmine FTW!"}}});

or load the test data using loadTestData. Here we load the contents of .questions from fake-ajax-fixture.html:

fakeAjax({urls: {"/questions/list": {successData: loadTestData(".questions", "fake-ajax-fixture.html")}}});

and when you need the error handler to be called you can

fakeAjax({urls: {"/fails": {errorMessage: "argh"}}});

Fake response data in JSON format (simply a js map):

fakeAjax({urls: {"/user": {successData: {name: "John", age: 30}}}});

Often, multiple Ajax calls are executed under the hood when e.g. clicking a link. fakeAjax lets you define which calls will succeed and which will fail:

fakeAjax({
  urls: {
    "/answers/get?questionId=question2": {successData: loadTestData(".answer2", "fake-ajax-fixture.html")},
    "/authors/get?answerId=answer2": {errorMessage: "author data not available"},
    "/onError": {successData: "Please try again later."}
  }
});

You are not forced to define any context. Maybe you are only interested in what is sent to the server? Then you can use latestAjax or latestAjaxWithUrlMatching to get a handle to desired ajax options recorded during the test run:

expect(latestAjaxWithUrlMatching('first').data).toEqual({'param1': 'value1', 'param2': 'value2'});
expect(latestAjaxWithUrlMatching('second').url).toContain('foo=bar');
expect(latestAjax().url).toEqual('/third');

Warnings and errors during the test run are logged into the firebug console, so you should consider keeping it open.

Hope you enjoy!