Estoy tratando de usar Jasmine para escribir algunas especificaciones de BDD para solicitudes básicas de jQuery AJAX. Actualmente estoy usando Jasmine en modo independiente (es decir, a través SpecRunner.html
). He configurado SpecRunner para cargar jquery y otros archivos .js. ¿Alguna idea de por qué lo siguiente no funciona? has_returned no se convierte en realidad, incluso aunque el "yuppi!" alerta aparece bien.
describe("A jQuery ajax request should be able to fetch...", function() {
it("an XML file from the filesystem", function() {
$.ajax_get_xml_request = { has_returned : false };
// initiating the AJAX request
$.ajax({ type: "GET", url: "addressbook_files/addressbookxml.xml", dataType: "xml",
success: function(xml) { alert("yuppi!"); $.ajax_get_xml_request.has_returned = true; } });
// waiting for has_returned to become true (timeout: 3s)
waitsFor(function() { $.ajax_get_xml_request.has_returned; }, "the JQuery AJAX GET to return", 3000);
// TODO: other tests might check size of XML file, whether it is valid XML
expect($.ajax_get_xml_request.has_returned).toEqual(true);
});
});
¿Cómo pruebo que se ha llamado a la devolución de llamada? Cualquier sugerencia a blogs / material relacionado con la prueba async jQuery con Jasmine será muy apreciada.
Mira el proyecto jasmine-ajax: http://github.com/pivotal/jasmine-ajax .
Es un asistente de inserción que (ya sea para jQuery o Prototype.js) se almacena en la capa XHR para que las solicitudes nunca salgan. A continuación, puede esperar todo lo que desee sobre la solicitud.
Luego le permite proporcionar respuestas fijas para todos sus casos y luego escribir pruebas para cada respuesta que desee: éxito, fracaso, no autorizado, etc.
Saca las llamadas Ajax del ámbito de las pruebas asincrónicas y le proporciona mucha flexibilidad para probar cómo deberían funcionar sus controladores de respuesta reales.
fuente
aquí hay un conjunto de pruebas de ejemplo simple para una aplicación js como esta
un conjunto de pruebas de muestra, que llamará a la devolución de llamada según la URL regexp
fuente
.andCallFake
, se usó en su.and.callFake
lugar. Gracias.Cuando especifico el código ajax con Jasmine, resuelvo el problema espiando cualquier función dependiente que inicie la llamada remota (como, por ejemplo, $ .get o $ ajax). Luego recupero las devoluciones de llamada configuradas y las pruebo discretamente.
Aquí hay un ejemplo que obtuve recientemente:
https://gist.github.com/946704
fuente
Pruebe jqueryspy.com Proporciona una elegante sintaxis similar a jquery para describir sus pruebas y permite que las devoluciones de llamada prueben después de que se haya completado el ajax. Es excelente para las pruebas de integración y puede configurar los tiempos de espera máximos de Ajax en segundos o milésimas de segundo.
fuente
Siento que necesito proporcionar una respuesta más actualizada ya que Jasmine está ahora en la versión 2.4 y algunas funciones han cambiado desde la versión 2.0.
Por lo tanto, para verificar que se haya llamado a una función de devolución de llamada dentro de su solicitud AJAX, debe crear un espía, agregarle una función callFake y luego usar el espía como su función de devolución de llamada. Así es como funciona:
He hecho el truco para la función de éxito, así como la función de error, para asegurarme de que Jasmine ejecutará las especificaciones lo antes posible, incluso si su AJAX devuelve un error.
Si no especifica una función de error y su AJAX devuelve un error, tendrá que esperar 5 segundos (intervalo de tiempo de espera predeterminado) hasta que Jasmine arroje un error
Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
. También puede especificar su propio tiempo de espera de esta manera:fuente