Ich versuche, Jasmine zu verwenden, um einige BDD-Spezifikationen für grundlegende jQuery AJAX-Anforderungen zu schreiben. Ich verwende Jasmine derzeit im Standalone-Modus (dh bis SpecRunner.html
). Ich habe SpecRunner so konfiguriert, dass jquery und andere .js-Dateien geladen werden. Irgendwelche Ideen, warum das Folgende nicht funktioniert? has_returned wird nicht wahr, obwohl das "yuppi!" Alarm wird gut angezeigt.
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);
});
});
Wie teste ich, ob der Rückruf aufgerufen wurde? Alle Hinweise auf Blogs / Materialien im Zusammenhang mit dem Testen von asynchronem jQuery mit Jasmine werden sehr geschätzt.
Schauen Sie sich das Jasmin-Ajax-Projekt an: http://github.com/pivotal/jasmine-ajax .
Es ist ein Drop-In-Helfer, der (entweder für jQuery oder Prototype.js) auf der XHR-Ebene stoppt, sodass Anforderungen nie ausgehen. Sie können dann alles erwarten, was Sie über die Anfrage wollen.
Anschließend können Sie Fixture-Antworten für alle Ihre Fälle bereitstellen und dann Tests für jede gewünschte Antwort schreiben: Erfolg, Misserfolg, nicht autorisiert usw.
Es nimmt Ajax-Aufrufe aus dem Bereich der asynchronen Tests heraus und bietet Ihnen viel Flexibilität beim Testen der Funktionsweise Ihrer tatsächlichen Antworthandler.
quelle
Hier ist ein einfaches Beispiel für eine Testsuite für eine App wie diese
Eine Beispiel-Testsuite, die einen Rückruf basierend auf der URL regexp aufruft
quelle
.andCallFake
, der.and.callFake
stattdessen verwendet wird. Vielen Dank.Wenn ich mit Jasmine Ajax-Code spezifiziere, löse ich das Problem, indem ich die abhängige Funktion ausspioniere, die den Remote-Aufruf initiiert (z. B. $ .get oder $ ajax). Dann rufe ich die darauf eingestellten Rückrufe ab und teste sie diskret.
Hier ist ein Beispiel, das ich kürzlich aufgezeigt habe:
https://gist.github.com/946704
quelle
Versuchen Sie es mit jqueryspy.com. Es bietet eine elegante jquery-ähnliche Syntax zur Beschreibung Ihrer Tests und ermöglicht Rückrufe zum Testen, nachdem der Ajax abgeschlossen ist. Es eignet sich hervorragend für Integrationstests und Sie können maximale Ajax-Wartezeiten in Sekunden oder Millesekunden konfigurieren.
quelle
Ich habe das Gefühl, dass ich eine aktuellere Antwort geben muss, da Jasmine jetzt auf Version 2.4 ist und einige Funktionen gegenüber Version 2.0 geändert wurden.
Um zu überprüfen, ob eine Rückruffunktion in Ihrer AJAX-Anfrage aufgerufen wurde, müssen Sie einen Spion erstellen, eine callFake-Funktion hinzufügen und dann den Spion als Rückruffunktion verwenden. So geht's:
Ich habe den Trick sowohl für die Erfolgsfunktion als auch für die Fehlerfunktion ausgeführt, um sicherzustellen, dass Jasmine die Spezifikationen so schnell wie möglich ausführt, auch wenn Ihr AJAX einen Fehler zurückgibt.
Wenn Sie keine Fehlerfunktion angeben und Ihr AJAX einen Fehler zurückgibt, müssen Sie 5 Sekunden (Standard-Timeout-Intervall) warten, bis Jasmine einen Fehler auslöst
Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
. Sie können auch Ihr eigenes Timeout wie folgt angeben:quelle