Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular promise not resolving in jasmine

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!

like image 794
Elmer Avatar asked Dec 01 '13 10:12

Elmer


1 Answers

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

    // ...
like image 75
musically_ut Avatar answered Sep 17 '22 20:09

musically_ut