I have the following jasmine test:
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();
    });
}));
I thought $rootScope.$apply was supposed to resolve all outstanding promises, but somehow it does not happen in this test.
How do i trigger promise resolving in a test like this? please help!
I think the $rootScope.$apply() is being called too soon in your case. This should work:
function getPromise(){
    var deferred = $q.defer();
    setTimeout(function(){
        deferred.resolve(true);
        $rootScope.$apply();
    }, 1000);
    return deferred.promise;
}
Update
You can inject mock $timeout service and resolve the promise in that explicitly using $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();
    // ...
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With