Estoy buscando QUnit para las pruebas unitarias de JavaScript. Estoy en una situación extraña en la que estoy comprobando el valor devuelto por la llamada Ajax.

Para la siguiente prueba, estoy intentando fallar a propósito.

// 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 realiza 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);
    }
  });
}
14
azamsharp 2 jun. 2009 a las 22:28

4 respuestas

La mejor respuesta

¡Iniciar y detener el uso de la biblioteca QUnit parece estar funcionando!

// 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();
  });
});
25
Giovanni Cappellotto 10 ago. 2013 a las 09:28

El verdadero problema aquí no es la necesidad de llamar a los métodos start () y stop (); de hecho, podría tener problemas para usar ese enfoque si no tiene cuidado al llamar a stop () nuevamente al final de su devolución de llamada si tiene métodos adicionales .ajax (). Lo que significa que te encuentras en un lío gruñón de tener que hacer un seguimiento si se han disparado todas las devoluciones de llamada para saber si aún necesitas llamar a stop () nuevamente.

La raíz del problema implica el comportamiento predeterminado de las solicitudes asincrónicas, y la solución simple es hacer que la solicitud .ajax () se realice de forma sincrónica estableciendo la propiedad async en false:

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

Aún así, el mejor enfoque es permitir el comportamiento asincrónico y utilizar la invocación correcta del método de prueba: asyncTest ( ) . De acuerdo con los documentos " Las pruebas asincrónicas se ponen en cola y se ejecutan una tras otra. Equivalente a llamar a una prueba normal () e inmediatamente a detener (). "

asyncTest("a test", function() {
  $.ajax({
    url: 'Sample.asmx/Service',
    success: function(d,s,x) {
      ok(true, "asynchronous PASS!");
      start();
    }
  });
});
13
Goyuix 17 ene. 2011 a las 16:56

He hecho algunas pruebas de qunit con ajax. no es lindo. Lo mejor que puedo encontrar es detener la prueba cuando se dispara ajax y comenzar de nuevo en la devolución de llamada exitosa. (usando los métodos start () y stop ()). Esto significaba una solicitud ajax a la vez, pero podría vivir con eso. Buena suerte

2
mkoryak 2 jun. 2009 a las 18:44

Hay muchas pruebas de qunit en mi proyecto. me gusta:

    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();
      });
    });
3
Ken 15 abr. 2013 a las 12:49