2009-06-02 8 views
14

Estoy buscando en QUnit para probar la unidad de JavaScript. Estoy en una situación extraña en la que estoy controlando el valor devuelto por la llamada Ajax.QUnit con Ajax, QUnit aprueba las pruebas que fallan

Para la prueba siguiente intento deliberadamente fallarla.

// test to check if the persons are returned! 
test("getPersons", function() { 
    getPersons(function(response) { 
    // persons = $.evalJSON(response.d); 
    equals("boo", "Foo", "The name is valid"); 
    }); 
}); 

Pero termina pasando todo el tiempo. Aquí está el método getPersons que hace que la llamada Ajax.

function getPersons(callback) { 
    var persons = null; 

    $.ajax({ 
    type: "POST", 
    dataType: "json", 
    data: {}, 
    contentType: "application/json", 
    url: "AjaxService.asmx/GetPersons", 
    success: function(response) { 
     callback(response); 
    } 
    }); 
} 
+0

me gustaría recomendar que también llena el "espera" número (segundo argumento de 'QUnit.test') para que sea más fácil coger cuando no todo es llamado en el tiempo. De lo contrario, podría estar pasando si 'start' se llama demasiado pronto antes de que todas las aserciones se hayan enviado. – Krinkle

Respuesta

25

¡El inicio y la detención con la biblioteca QUnit parece funcionar!

// test to check if the persons are returned! 
test("getPersons", function() { 
    stop(); 
    getPersons(function(response) { 
    persons = $.evalJSON(response.d); 
    equals(persons[0].FirstName, "Mohammad"); 
    start(); 
    }); 
}); 
+1

Como @Goyuix dijo que también puedes usar 'asyncTest()' en lugar de 'test()' para evitar llamar al 'stop()' función y para que sea explícito que esta es una prueba asíncrona. –

2

ive has some qunit testing with ajax. no es lindo. Lo mejor que puedo hacer es detener la prueba cuando se active ajax y volver a iniciarla en la devolución de llamada exitosa. (utilizando los métodos start() y stop()). Esto significaba una solicitud de ajax a la vez, pero podría vivir con eso. Buena suerte

+0

¡El inicio y la detención parecen estar funcionando! La solución se publica en la publicación a continuación. ¡Gracias! – azamsharp

+0

Pero me pregunto por qué mi enfoque anterior no funcionaba. Pude acceder a la respuesta y a todo. ¡Parecía que los iguales estaban fallando! – azamsharp

+2

Creo que debido a la naturaleza asincrónica de ajax, la prueba estaba terminando antes de que volviera la respuesta – mkoryak

13

El verdadero problema aquí no es tener que llamar a start() y stop() - de hecho se podía obtener en problemas usando este enfoque si no se tiene cuidado en llamar stop() de nuevo en el final de su devolución de llamada si tiene métodos .ajax() adicionales. Lo que significa que te encuentras en algún lío enredado de tener que hacer un seguimiento si todas las devoluciones de llamada se han activado para saber si todavía necesitas llamar a stop() nuevamente.

La raíz del problema está relacionado con el comportamiento predeterminado de peticiones asíncronas - y la solución simple es hacer que el (petición .ajax) ocurra de forma sincrónica mediante el establecimiento de la asíncrono propiedad en false:

test("synchronous test", function() { 
    $.ajax({ 
    url:'Sample.asmx/Service', 
    async:false, 
    success: function(d,s,x) { ok(true, "Called synchronously"); } 
    }); 
}); 

Incluso aún así, el mejor enfoque es permitir el comportamiento asíncrono y usar la invocación correcta del método de prueba: asyncTest(). De acuerdo con la documentación "pruebas asincrónicos se ponen en cola y se ejecutan uno tras otro. Equivalente a llamar a una prueba normal() y llamar inmediatamente stop()."

asyncTest("a test", function() { 
    $.ajax({ 
    url: 'Sample.asmx/Service', 
    success: function(d,s,x) { 
     ok(true, "asynchronous PASS!"); 
     start(); 
    } 
    }); 
}); 
+0

asyncTest (name, ...) es un método de conveniencia para test (name, function() {stop(); ...}). Anidamiento = mala idea. –

+0

@ Jörn - gracias por señalar la anidación. Volviendo a leer esta respuesta, no estoy seguro de por qué la envolví en primer lugar, excepto para ilustrar que podrías. Desenvolví el método asyncTest para que quede más claro cómo se debe usar. – Goyuix

3

Hay una gran cantidad de pruebas qunit en mi proyecto . como:

module("comment"); 
    asyncTest("comment1", function() { 
     expect(6); 
     $.ajax({ 
     url: 'http://xxx.com/comment', 
     dataType: "json", 
     type: "GET", 
     timeout: 1000 
     }).done(function(data) { 
     ok(true, "loaded"); 
     ok(data.data.length>1, "array size"); 
     ok(data.total, "attr total"); 
     var c = data.data[0]; 
     ok(c.id, "attr c.id"); 
     ok(c.user_id, "attr c.user_id"); 
     ok(c.type == 4, "attr c.type equal 4"); 
     }).fail(function(x, text, thrown) { 
     ok(false, "ajax failed: " + text); 
     }).always(function(){ 
     start(); 
     }); 
    }); 
Cuestiones relacionadas