Maneira adequada de mocking jQuery.ajax

O método jQuery.ajax retorna o objeto Deferred , então é fácil escrever uma versão parametrizada do mock ajax (exemplo no Jasmine ):

// Synchronous jQuery.ajax mock
spyOn
($, 'ajax').and.callFake(function(url) {
var ajaxMock = $.Deferred();

switch (url) {
case undefined:
ajaxMock
.resolve({
'error': 'Please use POST request'
});
break;
case 'valid_url':
ajaxMock
.resolve('some data');
break;
default: // invalid url
ajaxMock
.reject();
}

return ajaxMock.promise();
});

E isso é o equivalente a uma solicitação síncrona ajax. Mas é melhor não usar esse tipo de requisição, porque pode bloquear um navegador (lembra que A em AJAX significa assíncrono?).

Para obter uma solicitação assíncrona, você precisa adicionar o tempo limite :

// Asynchronous jQuery.ajax mock
spyOn
($, 'ajax').and.callFake(function(url) {
var ajaxMock = $.Deferred();

setTimeout
(function() {
switch (url) {
case undefined:
ajaxMock
.resolve({
'error': 'Please use POST request'
});
break;
case 'valid_url':
ajaxMock
.resolve('some data');
break;
default: // invalid url
ajaxMock
.reject();
}
}, 5);

return ajaxMock.promise();
});

Isso é tudo. Aproveite o seu novo mock.