2009-02-06 16 views

Respuesta

49

por burlarse de peticiones Ajax, puede intentar algo como esto ...

Aquí es la función que desea probar:

var functionToTest = function() { 
     $.ajax({ 
      url: 'someUrl', 
      type: 'POST', 
      dataType: 'json', 
      data: 'foo=1&foo=2&foo=3', 
      success: function (data) { 
       $('#main').html(data.someProp); 
      } 
     }); 
    }; 

aquí está el caso de prueba:

test('ajax mock test', function() { 
     var options = null; 
     jQuery.ajax = function (param) { 
      options = param; 
     }; 
     functionToTest(); 
     options.success({ 
      someProp: 'bar' 
     }); 
     same(options.data, 'foo=1&foo=2&foo=3'); 
     same($('#main').html(), 'bar'); 
    }); 

Se anulando esencialmente función ajax de jQuery y después comprueba la siguiente 2 cosas: - el valor que se pasa a la función ajax - invoca la devolución de llamada éxito y afirma que se hizo lo que se supone que debe hacer

+4

Me tomó alrededor de media hora para llegar a la función (param) {opciones = parámetro;}, pero entonces me di .. . Realmente genial. –

+0

Agradable. Muy agradable. – StuperUser

+0

Si estaba probando llamadas anidadas, ¿estas opciones se guardarían mejor en una matriz y para cada llamada a .push() las opciones de objetos a esa matriz? – StuperUser

5

simplemente empecé a usar Sinon.JS, que permite imitar de XMLHttpRequests y también ofrece una API simple falso-servidor. ¡Realmente fácil de usar! También ofrece integración con qunit.

15

En lugar de anular la función AJAX de jQuery, también se puede utilizar el plugin de jQuery Mockjax desarrollado por .appendTo. Este plugin básicamente hace lo que sugiere la otra respuesta, pero permite burlas mucho más sofisticadas. Por ejemplo, si usted tiene la función de:

$.ajax({ 
    url:"/api/user", 
    type:"GET", 
    dataType:"json", 
    data:'{"uid":"foobar"}', 
    success:function(data){ 
     console.log("Success!"); 
    }, 
    error:function(data){ 
     console.log("Error!"); 
    } 
}); 

Usted puede burlarse con mockjax simplemente llamando a la mockjax función, que se incluye de forma automática en jQuery:

$.mockjax({ 
    url:"/api/user", 
    type:"GET", 
    response:function(requestData){ 
     //handle the mock response in here 
     this.responseText = '{"fullname":"Mr. Foo Bar"}'; 
    } 
}); 

La segunda función de burla puede ser incluido en un archivo JavaScript externo, diga "mocks.js" y la única otra cosa que debe hacerse es incluir la biblioteca mockjax (que se puede encontrar en https://github.com/appendto/jquery-mockjax/). Lo único a tener en cuenta es que esto solo se burlará de las llamadas jQuery ajax, no de todas las XMLHttpRequests. Si quieres hacer eso, sigue los consejos de @ bertvh y usa Sinon.js.

+1

+1 a usar mockjax. Empecé a usarlo y es bastante bueno para pruebas unitarias, así como datos ficticios para el desarrollo de pantallas. El único problema que tuve fue que los archivos de datos json estaban siendo almacenados en caché por el navegador Chrome. Al borrar el caché se corrigieron los problemas de archivos obsoletos. – Evildonald