Je suppose qu'il existe deux types de tests que vous pouvez faire:
- Des tests unitaires qui simulent la requête AJAX (en utilisant les espions de Jasmine), vous permettant de tester tout votre code qui s'exécute juste avant la requête AJAX, et juste après . Vous pouvez même utiliser Jasmine pour simuler une réponse du serveur. Ces tests seraient plus rapides - et ils n'auraient pas besoin de gérer un comportement asynchrone - car il n'y a pas de véritable AJAX en cours.
- Des tests d'intégration qui exécutent de vraies requêtes AJAX. Celles-ci devraient être asynchrones.
Jasmine peut vous aider à faire les deux types de tests.
Voici un exemple de la façon dont vous pouvez simuler la demande AJAX, puis écrire un test unitaire pour vérifier que la fausse demande AJAX allait à l'URL correcte:
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"
});
}
Pour Jasmine 2.0, utilisez à la place:
expect($.ajax.calls.mostRecent().args[0]["url"]).toEqual("/products/123");
comme indiqué dans cette réponse
Voici un test unitaire similaire qui vérifie que votre rappel a été exécuté, sur une requête AJAX réussie:
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
});
}
Pour Jasmine 2.0, utilisez à la place:
spyOn($, "ajax").and.callFake(function(options) {
comme indiqué dans cette réponse
Enfin, vous avez laissé entendre ailleurs que vous pourriez vouloir écrire des tests d'intégration qui font de vraies requêtes AJAX - à des fins d'intégration. Cela peut être fait en utilisant les fonctionnalités asynchrones de Jasmine: waits (), waitsFor () et 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
});
}