unit-testing - test - stub calledonce
¿Cómo probar correctamente la unidad.ajax() de jQuery promete usar Jasmine y/o Sinon? (4)
Aquí hay un enfoque más simple con solo javascript.
quoteSnapshots: function (symbol, streamId) {
var FakeDeferred = function () {
this.error = function (fn) {
if (symbol.toLowerCase() === ''bad-symbol'') {
fn({Error: ''test''});
}
return this;
};
this.data = function (fn) {
if (symbol.toLowerCase() !== ''bad-symbol'') {
fn({});
}
return this;
};
};
return new FakeDeferred();
}
Las sentencias if dentro de cada devolución de llamada son las que utilizo en mi prueba para impulsar el éxito o la ejecución de errores.
Tengo una función bastante sencilla que devuelve una promesa jQuery .ajax () como tal:
CLAW.controls.validateLocation = function(val, $inputEl) {
return $.ajax({
url: locationServiceUrl + ''ValidateLocation/'',
data: {
''locationName'': val
},
beforeSend: function() {
$inputEl.addClass(''busy'');
}
}).done(function(result) {
// some success clauses
}).fail(function(result) {
// some failure clauses
}).always(function() {
// some always clauses
});
}
En su mayor parte, esta nueva interfaz de promesas funciona como un sueño, y la eliminación de las pirámides de devolución de llamada cuando se utiliza .ajax de jQuery es genial. Sin embargo, no puedo por la vida de mí descubrir cómo probar adecuadamente estas promesas usando Jasmine y / o Sinon:
Toda la documentación de Sinon supone que está utilizando devoluciones de llamada de la vieja escuela; No veo un solo ejemplo de cómo usarlo con promesas / diferidos
Al intentar utilizar un espía Jasmine o Sinon para espiar $ .ajax, el espía efectivamente sobrescribe la promesa, por lo que sus cláusulas
done
,fail
yalways
ya no existen en la función ajax, por lo que la promesa nunca se resuelve y arroja un error en lugar
Realmente me encantaría un ejemplo o dos de cómo probar estas nuevas promesas jQuery .ajax () con las libs de prueba antes mencionadas. He recorrido la red con bastante intensidad y realmente no he dragado nada al hacerlo. El único recurso que encontré mencionó usar Jasmine.ajax, pero me gustaría evitar eso si es posible, ya que Sinon proporciona la mayoría de las mismas capacidades listas para usar.
La solución dada por @ggozad no funcionará si usa cosas como .complete()
.
Pero, hurra, jazmín hizo un complemento para hacer exactamente esto: jasmine.github.io/2.0/ajax.html
beforeEach(function() {
jasmine.Ajax.install();
});
afterEach(function() {
jasmine.Ajax.uninstall();
});
//in your tests
expect(jasmine.Ajax.requests.mostRecent().url).toBe(''/some/cool/url'');
No es tan complejo en realidad. Es suficiente para devolver una promesa y resolverla de acuerdo con su caso.
Por ejemplo:
spyOn($, ''ajax'').andCallFake(function (req) {
var d = $.Deferred();
d.resolve(data_you_expect);
return d.promise();
});
para un éxito, o
spyOn($, ''ajax'').andCallFake(function (req) {
var d = $.Deferred();
d.reject(fail_result);
return d.promise();
});
por un fracaso
Para Jasmine 2.0, la sintaxis ha cambiado ligeramente:
spyOn($, ''ajax'').and.callFake(function (req) {});
el método .andCallFake () no existe en Jasmine 2.0
algo en esta línea / con sinon y jQuery diferido
ajaxStub = sinon.stub($, "ajax");
function okResponse() {
var d = $.Deferred();
d.resolve( { username: "testuser", userid: "userid", success: true } );
return d.promise();
};
function errorResponse() {
var d = $.Deferred();
d.reject({},{},"could not complete");
return d.promise();
};
ajaxStub.returns(okResponse());
ajaxStub.returns(errorResponse());