Thursday, August 18, 2011

Stubbing out AJAX methods

I have always had trouble with the standard way of testing out AJAX calls with QUnit.

There are a number of problems with it.

1) You have to stop and start the tests while waiting for an AJAX response
2) If you don't give a large enough gap, then your test may fail while waiting for an AJAX response.
3) If you have too large a gap, it slows down your tests

However, today I found this cool method of dealing with it.

http://lostechies.com/johnteague/2009/02/10/another-way-to-test-ajax-methods/

Essentially, you stub out jQuery's $.ajax() method with your own for your tests (as for unit testing, you really just want to test your code around the ajax method, not test jQuery's ajax method).

In my own case, I was using $.ajax and not $.getJSON. It took me a little while to work out I had to create a trigger for the success() function rather then callback() as mentioned in the article.



var stubbedAjax = function(settings){
settings.beforeSend();
// so I can check error cases
if (settings.url == 'error'){
settings.error();
} else {
settings.success({data: "data"});
}
}
var originalAjax = jQuery.ajax;
module("WESTFIELD Product Index Aggregator",{setup:function(){jQuery.ajax = stubbedAjax}, teardown:function(){jQuery.ajax = originalAjax}});