Ich versuche, einen Dienst zu testen, den ich baue, der Angulars $q Implementierung von Promises verwendet. Ich verwende eine Kombination aus Karma, Mocha, Chai, Sinon, Sinon Chai und Chai als Verheißen.
Alle Tests, die ich geschrieben habe und Versprechen zurückschicke, sind diejenigen, die ablehnen oder $q.all([ ... ])
verwenden. Ich habe alles versucht, was ich denken konnte, aber ich kann nicht finden, wo das Problem ist.
Das Folgende ist eine schlanke Version von dem, was ich testen:
"use strict";
describe("Promise", function() {
var $rootScope,
$scope,
$q;
beforeEach(angular.mock.inject(function (_$rootScope_, _$q_) {
$rootScope = _$rootScope_;
$q = _$q_;
$scope = $rootScope.$new();
}));
afterEach(function() {
$scope.$apply();
});
it("should resolve promise and eventually return", function() {
var defer = $q.defer();
defer.resolve("incredible, this doesn't work at all");
return defer.promise.should.eventually.deep.equal("incredible, this doesn't work at all");
});
it("should resolve promises as expected", function() {
var fst = $q.defer(),
snd = $q.defer();
fst
.promise
.then(function (value) {
value.should.eql("phew, this works");
});
snd
.promise
.then(function (value) {
value.should.eql("wow, this works as well");
});
fst.resolve("phew, this works");
snd.resolve("wow, this works as well");
var all = $q.all([
fst.promise,
snd.promise
]);
return all.should.be.fullfiled;
});
it("should reject promise and eventually return", function() {
return $q.reject("no way, this doesn't work either?").should.eventually.deep.equal("no way, this doesn't work either?");
});
it("should reject promises as expected", function() {
var promise = $q.reject("sadly I failed for some stupid reason");
promise
["catch"](function (reason) {
reason.should.eql("sadly I failed for some stupid reason");
});
var all = $q.all([
promise
]);
return all.should.be.rejected;
});
});
Die dritte, letzte und der erste Test sind diejenigen, die scheitern. Eigentlich versagt es nicht, es löst sich nur, nachdem das Timeout überschritten ist und ich bekomme eine Error: timeout of 2000ms exceeded
.
EDIT: Ich habe gerade versucht, mit Kris Kowal ‚s Umsetzung der Versprechen zu testen und es funktioniert mit, dass nur in Ordnung.
P.S.Ich habe tatsächlich festgestellt, dass irgendwo in den Schalen von Mocha, Chai oder Chai As Promise etwas Zeit verbracht wird und der afterEach
Hook später als die Zeitüberschreitung aufgerufen wird.
Wenn ich den Pseudo-Code verstehe, sieht es so aus, als würden Sie '$ scope. $ Apply()' erst aufrufen, nachdem Sie die Erwartungen formuliert haben.Können Sie versuchen, es anzurufen, nachdem Sie das Versprechen gelöst haben? –
Ich habe das auch schon probiert, ich werde bald mit diesen Tests ein Fiedel rauf und runter laufen. – Roland
Running '$ scope. $ Apply()' in 'afterJeach' könnte ein Problem sein, falls Sie den Wert der Versprechen erwarten, bevor das' afterJeach' ausgeführt wird –