So testen Sie das getan und scheitern Deferred-Objekt mit Jasmin
Hier ist der code, der über die javascript-submit request (1).
Hier ist der test über die Verspottung der ajax-Anfrage durch die Verwendung von Jasmin (2).
Möchte ich verspotte die server Verhalten. Irgendwelche Ideen?
Siehe auch den Kommentar zu (1) und (2) für weitere details.
P. S.:
Eigentlich in beiden Fällen das getan und das scheitern der Latenten Gegenstand der fakeFunction genannt werden.
(1)
submitForm: function () {
//the server execute fail only if message.val() is empty
//and I would like to mock this behaviour in (2)
backendController.submitForm(message.val()).done(this.onSuccess).fail(this.onError);
},
backendController.submitForm = function (message) {
return $.ajax({
url: 'some url',
type: 'POST',
dataType: 'json',
data: {
message: message
}
}).done(function () {
//some code;
});
};
(2)
describe('When Submit button handler fired', function () {
var submitFormSpy,
fakeFunction = function () {
this.done = function () {
return this;
};
this.fail = function () {
return this;
};
return this;
};
beforeEach(function () {
submitFormSpy = spyOn(backendController, 'submitForm').andCallFake(fakeFunction);
});
describe('if the message is empty', function () {
beforeEach(function () {
this.view.$el.find('#message').text('');
this.view.$el.find('form').submit();
});
it('backendController.submitForm and fail Deferred Object should be called', function () {
expect(submitFormSpy).toHaveBeenCalled();
//how should I test that fail Deferred Object is called?
});
});
describe('if the message is not empty', function () {
beforeEach(function () {
this.view.$el.find('#message').text('some text');
this.view.$el.find('form').submit();
});
it('backendController.submitForm should be called and the fail Deferred Object should be not called', function () {
expect(submitFormSpy).toHaveBeenCalled();
//how should I test that fail Deferred Object is not called?
});
});
});
Mit einem wrapper um deine Ajax-calls wird das testen wesentlich einfacher. Siehe github.com/webadvanced/takeCommand
vielen Dank für Ihren Vorschlag. Eigentlich verstehe ich nicht, warum genau sollte ich verwenden
var spy = spyOn(Klasse, "Methode"); actionThatCallsClassMethod(); erwarten(spy).toHaveBeenCalled(); hat mir geholfen, aus Ihrem Beispiel.
vielen Dank für Ihren Vorschlag. Eigentlich verstehe ich nicht, warum genau sollte ich verwenden
/webadvanced/takeCommand
seit $.ajax
schon, was ich brauche. Könnten Sie mir Antworten, schreiben einige Beispiel-code?var spy = spyOn(Klasse, "Methode"); actionThatCallsClassMethod(); erwarten(spy).toHaveBeenCalled(); hat mir geholfen, aus Ihrem Beispiel.
InformationsquelleAutor Lorraine Bernard | 2012-08-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wir tatsächlich lief in das gleiche problem, versuchen zu testen, Latente Objekte AJAXed Vorlage scripts für on-the-fly-templating. Unser Test-Lösung umfasst die Verwendung der Jasmin-Ajax Bibliothek in Verbindung mit Jasmin selbst.
Also wahrscheinlich wird es so etwas wie dieses:
Andere Sache, wenn Sie können, versuchen Sie brechen die Funktionalität, so dass Sie nicht die Prüfung der gesamten DOM-zu-Antwort-callback-Pfad in einem test. Wenn Sie granular genug sind, können Sie tatsächlich testen asynchronen Latente Auflösungen durch Verwendung der Zurückgestellten Objekte, die sich in Ihren tests!
Der Schlüssel ist, um tatsächlich Latente Objekte in Ihre tests selbst, so dass der Anwendungsbereich der
expect
Anruf noch innerhalb Ihrerit
Funktion blockieren.Beachten Sie, dass pro jasmine, ajax-3.0
response
ersetzt mitrespondWith
finden Sie unter release notesInformationsquelleAutor Aintaer
Hier ist, wie ich es geschafft, es zu tun.
Im Grunde der $.ajax-Objekts gibt ein Deferred-Objekt, so können Sie Spion auf $.ajax und die Rückkehr eines Latenten und dann lösen Sie es manuell ausführen .done () - code in JavaScript -
Code
Test
sehr einfach, danke!
InformationsquelleAutor Tony
Wäre es viel einfacher zu testen, wenn Sie hatte eine var mit dem ajax-request promise-Objekt. In diesem Fall können Sie tun:
Unten poste ich noch ungetestete code, der möglicherweise zu Ihnen passen. Ich nehme an, dass der ajax-Aufruf initialisiert .submit() der Klasse? Vielleicht sollten Sie die Initialisierung der ajax-request von einem läuft () - block und nicht von beforeEach(), aber Sie sollten versuchen, mit den man arbeitet.
Aber ich bin nicht sicher, dass die Zeile
tut, was Sie wollen. Ist es möglich, Spion auf einem anderen Spion? Und wenn ja, warum fordern Sie die spy ? Vielleicht sollten Sie versuchen,
InformationsquelleAutor basos