저는 Angular의 $q Promise 구현을 사용하여 빌드 한 서비스를 테스트하려고합니다. 나는 약속대로 카르마, 모카, 차이, 시논, 시온 차이, 차이의 조합을 사용하고 있습니다.
내가 작성하고 약속을 되 돌리는 모든 테스트는 통과하지만 $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
이됩니다.
편집 : 나는 방금 Kris Kowal의 테스트 구현을 시도했지만 그걸로 잘 작동합니다.
P.나는 사실 Mocha, Chai 또는 Chai 약속의 그릇에 어딘가에 시간이 있다는 것을 발견했으며 걸이가 시간 초과보다 늦게 호출됩니다.
의사 코드를 이해하고 있다면, 기대 한대로 텍스트를 입력 할 때까지'$ scope. $ apply()'를 호출하지 않은 것처럼 보입니다.약속을 해결하거나 거절 한 직후에 전화 해 볼 수 있습니까? –
나는 실제로 그것을 시도해 보았습니다. 나는이 테스트를 통해 곧 도약 할 것입니다. – Roland
'afterEach'에서'$ scope. $ apply()'를 실행하는 것은'afterEach'가 실행되기 전에 약속 값을 기대할 때 문제가 될 수 있습니다. –