Angularjs 角$q.何时在Karma单元测试中未解决

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

我使用$q.when来包装其他lib承诺。 它就像一个符咒,但当我试图在业力中运行它时,即使我运行了$digest,甚至在超时之后,承诺也无法解决(done())。 以下是示例代码:

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();