【发布时间】:2015-01-01 07:53:42
【问题描述】:
我正在尝试测试我构建的服务,该服务使用 Angular 的 $q Promises 实现。我正在使用 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;
});
});
第三个、最后一个和第一个测试是失败的。实际上它并没有失败,它只是在超过超时后解决,我得到一个Error: timeout of 2000ms exceeded。
编辑:我刚刚尝试使用Kris Kowal 的承诺实现进行测试,它可以正常工作。
PS 我实际上发现在 Mocha、Chai 或 Chai As Promised 的碗中某处花费了一些时间,并且 afterEach 挂钩在超时之后被调用。
【问题讨论】:
-
如果我理解伪代码,看起来您在发送期望文本后才调用
$scope.$apply()。您可以在解决/拒绝承诺后尝试调用它吗? -
其实我也试过了,我很快就会搞定这些测试。
-
-
@khanhto - 这是真的,@proloser 提到我只使用
afterEach进行清理。在我这样做的时候我没有想到。
标签: javascript angularjs unit-testing angular-promise