Estoy tratando de usar Jasmine para escribir algunas especificaciones BDD para solicitudes básicas de jQuery AJAX. Actualmente estoy usando Jasmine en modo independiente (es decir, a través SpecRunner.html ). Configuré SpecRunner para cargar jquery y otros archivos .js. ¿Alguna idea de por qué lo siguiente no funciona? has_returned no se hace realidad, 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 de blogs/material relacionado con la prueba de jQuery asíncrono con Jasmine será muy apreciada.
Supongo que hay dos tipos de pruebas que puedes hacer:
Jasmine puede ayudarte a hacer ambos tipos de pruebas.
Aquí hay una muestra de cómo puede falsificar la solicitud de AJAX y luego escribir una prueba de unidad para verificar que la solicitud de AJAX falsificada iba a la URL correcta:
it("should make an AJAX request to the correct URL", function() { spyOn($, "ajax"); getProduct(123); expect($.ajax.mostRecentCall.args[0]["url"]).toEqual("/products/123"); }); function getProduct(id) { $.ajax({ type: "GET", url: "/products/" + id, contentType: "application/json; charset=utf-8", dataType: "json" }); }Para usar Jasmine 2.0 en su lugar:
expect($.ajax.calls.mostRecent().args[0]["url"]).toEqual("/products/123");como se indica en esta respuesta
Aquí hay una prueba de unidad similar que verifica que se ejecutó su devolución de llamada, luego de que una solicitud AJAX se completó con éxito:
it("should execute the callback function on success", function () { spyOn($, "ajax").andCallFake(function(options) { options.success(); }); var callback = jasmine.createSpy(); getProduct(123, callback); expect(callback).toHaveBeenCalled(); }); function getProduct(id, callback) { $.ajax({ type: "GET", url: "/products/" + id, contentType: "application/json; charset=utf-8", dataType: "json", success: callback }); }Para usar Jasmine 2.0 en su lugar:
spyOn($, "ajax").and.callFake(function(options) {como se indica en esta respuesta
Finalmente, ha insinuado en otra parte que es posible que desee escribir pruebas de integración que realicen solicitudes AJAX reales, con fines de integración. Esto se puede hacer usando las características asincrónicas de Jasmine: waits(), waitsFor() y runs():
it("should make a real AJAX request", function () { var callback = jasmine.createSpy(); getProduct(123, callback); waitsFor(function() { return callback.callCount > 0; }); runs(function() { expect(callback).toHaveBeenCalled(); }); }); function getProduct(id, callback) { $.ajax({ type: "GET", url: "data.json", contentType: "application/json; charset=utf-8" dataType: "json", success: callback }); }Mire el proyecto jasmine-ajax: http://github.com/pivotal/jasmine-ajax .
Es un ayudante directo que (ya sea para jQuery o Prototype.js) se conecta a 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 de dispositivos para todos sus casos y luego escribir pruebas para cada respuesta que desee: éxito, fracaso, no autorizado, etc.
Saca las llamadas de Ajax del ámbito de las pruebas asincrónicas y le brinda mucha flexibilidad para probar cómo deberían funcionar sus controladores de respuesta reales.
aquí hay un conjunto de pruebas de ejemplo simple para una aplicación js como esta
var app = { fire: function(url, sfn, efn) { $.ajax({ url:url, success:sfn, error:efn }); } };un conjunto de pruebas de muestra, que devolverá la llamada en función de la expresión regular de URL
describe("ajax calls returns", function() { var successFn, errorFn; beforeEach(function () { successFn = jasmine.createSpy("successFn"); errorFn = jasmine.createSpy("errorFn"); jQuery.ajax = spyOn(jQuery, "ajax").andCallFake( function (options) { if(/.*success.*/.test(options.url)) { options.success(); } else { options.error(); } } ); }); it("success", function () { app.fire("success/url", successFn, errorFn); expect(successFn).toHaveBeenCalled(); }); it("error response", function () { app.fire("error/url", successFn, errorFn); expect(errorFn).toHaveBeenCalled(); }); });