An illustrative $q servive unit test case

This test case shows different ways to use $q.defer() and resolve().

    'use strict';
    describe('how to test with promises', function () {
        var deferred, $rootScope;

        beforeEach(function () {
            inject(function ($q, _$rootScope_) {
                $rootScope = _$rootScope_;
                deferred = $q.defer();
            });
        });

        it('does a thing one way', function () {
            deferred.promise.then(function (value) {
                expect(value).toBe(10);
            });
            deferred.resolve(10);
            $rootScope.$digest();
         });

         it('does a thing another way', function () {
             var handler = jasmine.createSpy('success');
             deferred.promise.then(handler);
             deferred.resolve(4);
             $rootScope.$digest();
             expect(handler).toHaveBeenCalledWith(4);
         });

        it('does a thing one way', function() {
            var value;
            deferred.promise.then(function(_value_) {
                value = _value_;
            });
            deferred.resolve(10);
            expect(value).not.toBe(10); // not yet 10 because 
                                        // $digest hasn't run
            $rootScope.$digest();
            expect(value).toBe(10); // 10 because $digest 
                                    // already ran
        });
     });

Leave a comment