Angular promise not resolving in jasmine

angularjs, jasmine, promise, q, unit-testing

Solution

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

    // ...

Problem

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!

Original source