Angularjs 角$q.何时在Karma单元测试中未解决
我使用$q.when来包装其他lib承诺。 它就像一个符咒,但当我试图在业力中运行它时,即使我运行了$digest,甚至在超时之后,承诺也无法解决(done())。 以下是示例代码:Angularjs 角$q.何时在Karma单元测试中未解决,angularjs,jasmine,karma-runner,Angularjs,Jasmine,Karma Runner,我使用$q.when来包装其他lib承诺。 它就像一个符咒,但当我试图在业力中运行它时,即使我运行了$digest,甚至在超时之后,承诺也无法解决(done())。 以下是示例代码: describe('PouchDB', function () { var $q, $rootScope; beforeEach(inject(function (_$rootScope_, _$q_) { $rootScope = _$rootScope_; $q = _$q_; })); i
describe('PouchDB', function () {
var $q, $rootScope;
beforeEach(inject(function (_$rootScope_, _$q_) {
$rootScope = _$rootScope_;
$q = _$q_;
}));
it("should run", function (done) {
function getPromise() {
var deferred = Q.defer();
deferred.resolve(1);
return deferred.promise;
}
$q.when(getPromise())
.then(function () {
done(); // this never runs
});
$rootScope.$digest();
});
为什么??这是什么原因?我真的搞不懂
更新(解决方案)
我不明白为什么$q.when没有在Karma中解决-它有nextTick函数,但我无法调试这个问题。
相反,我抛弃了$q.when,编写了一个简单的函数,将PockDB(或任何其他类似的q)转换为$q:
我已经对变量进行了调整,并在此基础上注入了依赖项名称,以便在继续编写测试时保持清晰。如果
done()。理想情况下,应该监视done(),但如果不知道它来自何处,则无法向您演示如何设置spy函数
缺少的另一个细节是此测试套件中没有expect()。没有它,我就无法知道你期望得到什么
describe('PouchDB', function () {
var scope, db, q, rootScope;
beforeEach(
inject(
function(_$rootScope_, _$q_){
rootScope = _$rootScope_;
scope = rootScope.$new();
q = _$q_;
}
)
);
it("should run", function(){
//spy should be constructed here
function getPromise() {
var deferred = q.defer();
deferred.resolve(1);
return deferred.promise;
}
q.when(getPromise)
.then(function () {
done();
});
scope.$digest();
//assertion should be here
});
});
从表面上看,诀窍在于:
$rootScope.$apply();
我只是有同样的问题,这对我来说很有效;我的准备工作很简单,我没有创建新的范围(我编辑了问题),我用$timeout和flush尝试过。。。创建新的作用域并删除超时后没有任何变化。我不明白为什么它会改变任何东西-我没有显式使用$scope,反正它不起作用。伙计,done()是用于Karma内部异步测试的Jasmine函数。如果无法访问代码,则Assert并不重要。我从来没有理由使用done()并倾向于忘记它。为什么要同时使用Q和$Q?也许Karma(或者它使用的AngularMocks库)期望得到由$q生成的承诺。defer()而不是q。defer()我使用PockDB,它有自己的承诺,所以我需要用$q包装它们。我在示例中使用Q只是为了简化事情——结果是一样的:$Q.when在Karma中没有解决,因为它包装了外部承诺,顺便说一句,$Q.when的主要用途是
$rootScope.$apply();