Comment puis-je vérifier l'AJAX de jQuery événements avec Jasmine?
Je suis en train d'utiliser le Jasmin pour écrire quelques BDD spécifications de la base de jQuery AJAX demandes. Je suis actuellement en utilisant Jasmin en mode autonome (c'est à dire par le biais de SpecRunner.html
). J'ai configuré le SpecRunner pour charger jquery et autres .js fichiers. Des idées pourquoi la suivante ne fonctionne pas? has_returned ne devient pas vrai, même pensé que les "yuppi!" alerte s'affiche 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);
});
});
Comment puis-je tester que le rappel a été appelé? Les pointeurs vers les blogs/matériel pour l'essai async jQuery avec Jasmine sera grandement apprécié.
Vous devez vous connecter pour publier un commentaire.
Je pense qu'il y a deux types de tests que vous pouvez faire:
Jasmin peut vous aider à faire les deux types de tests.
Voici un exemple de comment vous pouvez les faux de la requête AJAX, puis d'écrire un test unitaire pour vérifier que le faux requête AJAX a été d'aller à l'URL:
Pour Jasmin 2.0 utiliser à la place:
comme indiqué dans cette réponse
Ici est un analogue de l'unité de test qui vérifie votre rappel a été exécuté, sur une requête AJAX terminer avec succès:
Pour Jasmin 2.0 utiliser à la place:
comme indiqué dans cette réponse
Enfin, vous avez fait allusion ailleurs que vous pouvez écrire des tests d'intégration qui font des requêtes AJAX - pour l'intégration des fins. Cela peut être fait à l'aide de Jasmin est un système caractéristiques: attend(), waitsFor() et court():
Regarder le jasmin-ajax projet: http://github.com/pivotal/jasmine-ajax.
C'est un assistant qui (pour jQuery ou Prototype.js) les talons à l'XHR couche de sorte que les demandes ne sortent jamais. Vous pouvez alors vous attendre tout ce que vous voulez à propos de la demande.
Alors il vous permet de fournir un luminaire réponses pour toutes vos affaires et écrire des tests pour chaque réponse que vous souhaitez: le succès, l'échec, non autorisée, etc.
Il prend les appels Ajax hors de la sphère de tests asynchrones et vous offre beaucoup de flexibilité pour tester la façon dont votre réponse réelle des gestionnaires devraient travailler.
voici un exemple simple de la suite de tests
pour une application js comme ce
un test de l'échantillon de suite, qui sera appel le rappel basé sur l'url regexp
.andCallFake
, utilisé.and.callFake
à la place. Merci.Alors que j'ai spécifié code ajax avec le Jasmin, je résoudre le problème par l'espionnage sur tout dépendait fonction lance l'appel distant (comme, disons, $.obtenir ou $ajax). Puis-je récupérer les rappels de jeu sur celui-ci et de les tester de façon discrète.
Voici un exemple que j'ai gisted récemment:
https://gist.github.com/946704
Essayer jqueryspy.com
Il fournit un élégant jquery comme syntaxe pour décrire vos tests et permet les rappels à l'essai après l'ajax a complet. Son grand pour des tests d'intégration et vous pouvez configurer maximum ajax temps d'attente en secondes ou en milleseconds.
Je sens que j'ai besoin de fournir une plus up-to-date de répondre depuis le Jasmin est maintenant à la version 2.4 et quelques fonctions ont changé à partir de la version 2.0.
Donc, pour vérifier qu'une fonction de rappel a été appelé au sein de votre requête AJAX, vous devez créer un espion, ajouter un callFake fonction d'elle, puis utiliser l'espion que votre fonction de rappel. Voici comment ça se passe:
J'ai fait le tour pour le succès de la fonction ainsi que la fonction d'erreur pour s'assurer que Jasmine va exécuter les specs, dès que possible, même si votre AJAX retourne une erreur.
Si vous ne spécifiez pas une fonction d'erreur et que votre AJAX retourne une erreur, vous devrez attendre 5 secondes (valeur par défaut intervalle de délai d'attente) jusqu'à ce que le Jasmin déclenche une erreur
Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
. Vous pouvez également définir vos propres timeout comme ceci: