Angular承诺不会在茉莉花中解决

Elm*_*mer 6 unit-testing promise jasmine angularjs q

我有以下茉莉花测试:

it('should resolve promise', inject(function ($q, $rootScope) {

    function getPromise(){
        var deferred = $q.defer();
        setTimeout(function(){
            deferred.resolve(true);
        }, 1000);
        return deferred.promise;
    }

    var p = getPromise();
    var cb = jasmine.createSpy();

    runs(function(){
        expect(cb).not.toHaveBeenCalled();

        p.then(cb);

        $rootScope.$apply();
    });

    waitsFor(function(){
        return cb.callCount == 1;
    });

    runs(function(){
        expect(cb).toHaveBeenCalled();

        $rootScope.$apply();
    });

}));
Run Code Online (Sandbox Code Playgroud)

我认为$ rootScope.$ apply应该解决所有未完成的承诺,但不知怎的,它不会在这个测试中发生.

如何在这样的测试中触发promise解析?请帮忙!

mus*_*_ut 12

$rootScope.$apply()在你的情况下,我认为这个问题太快了.这应该工作:

function getPromise(){
    var deferred = $q.defer();
    setTimeout(function(){
        deferred.resolve(true);
        $rootScope.$apply();
    }, 1000);
    return deferred.promise;
}
Run Code Online (Sandbox Code Playgroud)

更新

您可以注入模拟$timeout服务并解决明确使用的承诺$timeout.flush().

it('should resolve promise', inject(function ($q, $timeout, $rootScope) {

    function getPromise(){
        var deferred = $q.defer();
        $timeout(function(){
            deferred.resolve(true);
        }, 1000); 
        return deferred.promise;
    }

    // ...

    $timeout.flush();

    // ...
Run Code Online (Sandbox Code Playgroud)