Я пытаюсь протестировать созданный мной сервис, использующий $q Angular. выполнение Обещаний. Я использую комбинацию Karma, Mocha, Chai, Sinon, Sinon Chai и Chai as Promised.
Все тесты, которые я написал и возвращают обещания, проходят, кроме тех, которые отклоняют или используют $q.all([ ... ])
. Я перепробовал все, что мог придумать, но не могу найти, в чем проблема.
Ниже приведена тонкая версия того, что я тестирую:
"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;
});
});
3-й, последний и первый тест - те, которые не пройдены. На самом деле это не сбой, он просто разрешается после превышения тайм-аута, и я получаю Error: timeout of 2000ms exceeded
.
EDIT: я только что попытался протестировать реализацию Kris Kowal обещания, и это прекрасно работает с этим.
P.S. На самом деле я обнаружил, что какое-то время было потрачено где-то в мисках Mocha, Chai или Chai As Promised, а хук afterEach
вызывается позже тайм-аута.
$scope.$apply()
до тех пор, пока не отправите сообщение об ожиданиях. Можете ли вы попробовать вызвать его сразу после того, как вы разрешите/отклоните обещание? - person Michal Charemza   schedule 08.11.2014$scope.$apply()
вafterEach
может быть проблемой, если вы ожидаете значение промисов до запускаafterEach
- person Khanh TO   schedule 09.11.2014afterEach
только для очистки. Это просто не пришло мне в голову в тот момент, когда я это сделал. - person Roland   schedule 10.11.2014