jasmine-test-Funktion, die eine Zusage zurückgibt
Habe ich die folgende Implementierung der Funktion
function getRepo(url) {
var repos = {};
if (repos.hasOwnProperty(url)) {
return repos[url];
}
return $.get(url)
.then(repoRetrieved)
.fail(failureHandler);
function repoRetrieved(data) {
return repos[url] = data;
}
function failureHandler(err, xhr) {
throw new Error(xhr.responseText);
}
}
Und ich schrieb die folgenden tests:
describe('"getRepo" method', function() {
var getDeffered;
var $;
beforeEach(function() {
getDeffered = Q.defer();
$ = jasmine.createSpyObj('$', ['get']);
$.get.and.returnValue(getDeffered.promise);
});
it('should return a promise', function(){
expect(getRepo('someURL')).toEqual(getDeffered.promise);
});
});
Und dieser test schlägt fehl. Ich denke, da rufe ich die Methode dann.
Es nicht scheitern, wenn die Implementierung der Funktion ist:
function getRepo(url) {
return $.get(url);
}
dies ist die Botschaft, Jasmin wirft bei der Verwendung von Q. defer()
Expected { promiseDispatch : Function, valueOf : Function, inspect : Function }
to equal { promiseDispatch : Function, valueOf : Function, inspect : Function }.
- Und dies ist die Botschaft, wenn ich jQuery Deferred:
Expected { state : Function, always : Function, then : Function, promise : Function, pipe : Function, done : Function, fail : Function, progress : Function }
to equal { state : Function, always : Function, then : Function, promise : Function, pipe : Function, done : Function, fail : Function, progress : Function }.
jQuery Deferred-test Durchführung:
describe('"getRepo" method', function() {
var getDeffered;
var $;
beforeEach(function() {
getDeffered = real$.Deferred();
$ = jasmine.createSpyObj('$', ['get']);
$.get.and.returnValue(getDeffered.promise());
});
it('should return a promise', function(){
expect(getRepo('someURL')).toEqual(getDeffered.promise());
});
});
- 1) Verspricht in jQuery und verspricht in Q sind verschiedene Objekte; 2) Sie sind die Freigabe der Zalgo durch mischen sync und async Antworten in Ihrem code, bitte nicht.
- Und zwischen, beiden Versprechungen sind plain/Objekt und Sie sind Instanz von Versprechen.
- Sie sind. wie gesagt, ich bin mocking jQuery, und seine Methode "get" gibt die latente, die ich definiert durch Q. defer()
- Das problem ist, dass
$.Deferred().then()
wieder die gleichen Versprechen, es ist genannt, aber Q ' s gibt eine neue. - Ich habe aktualisiert mein Frage.. und fügte hinzu, Jasmin Ausnahmen. bitte werfen Sie einen Blick wieder
- Mit
Q
es ist klar (wie gesagt, Sie überprüfenQ.Defer().promise
gegenQ.Defer().promise.then().fail()
, das sind zwei verschiedene zusagen); mit jQuery, es ist nicht klar, wie setzen Sie es im test. BTW, was ist dein Ziel hier? Es ist ein bisschen redundant, wenn Sie nur wollen, um zu überprüfen, ob oder nicht Sie bekommen das Versprechen, als ein Ergebnis Ihres Anrufs. - Ich fügte hinzu, jQuery Deferred test-Durchführung
Du musst angemeldet sein, um einen Kommentar abzugeben.
Statt testen das zurückgegebene Objekt als ein Versprechen, Sie können testen, die gelöst Wert direkt, das gibt ein genaueres Ergebnis:
Bitte beachten Sie, dass jQuery die Verheißung, die Umsetzung ist ziemlich schlecht. Es ist am besten, wenn Sie die Verwendung des einheitlichen Verspricht, oder eine Bibliothek, wie Bluebird.
Erstellen Sie eine lokale
$
variable, dann die Zuweisung eines spy-Objekt zu. Das ist nicht das gleiche$
dassgetRepo
verwendet.Sollten Sie entfernen die lokale variable
var $;
- und mock-original$.get
.Versuchen Sie dies: