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.