jasmine + angular ex 13

promise

by dingen2010

HTML

<script src="https://jasmine.github.io/2.4/lib/jasmine.js"></script>
<script src="https://jasmine.github.io/2.4/lib/jasmine-html.js"></script>
<script src="https://jasmine.github.io/2.4/lib/boot.js"></script>
<link rel="stylesheet" href="https://jasmine.github.io/2.4/lib/jasmine.css">
<script src="https://code.angularjs.org/1.4.9/angular.js"></script>
<script src="https://code.angularjs.org/1.4.9/angular-mocks.js"></script>

JavaScript

//--------------BL------------
(function(angular) {
    function GreetController(DataService) {
        var self = this;
        self.greeting = null;

        self.init = function() {
            DataService.getGreeting()
                .then(function(result) {
                        self.greeting = result;
                    },
                    function(result) {
                        console.error('Error: ' + result);
                    });
        };
    }

    angular.module('MyModule', [])
        .controller('GreetController', ['DataService', GreetController]);
})(angular);

//--------------specs------------
describe('GreetController spec', function() {

    var mockService, deferred, ctrl;
    beforeEach(module('MyModule'));

    beforeEach(module(function($provide) {
        mockService = jasmine.createSpyObj('DataService', ['getGreeting']);
        $provide.value('DataService', mockService);
    }));

    beforeEach(inject(function($controller) {
        ctrl = $controller('GreetController');
    }));

    it('greeting should be null', function() {
        expect(ctrl.greeting).toBeNull();
    });

    it('greeting should change after promise resolved', inject(function($q, $rootScope) {
        //create promise
        deferred = $q.defer();

        //mock service response (foc controller's constructor)
        mockService.getGreeting.and.returnValue(deferred.promise);

        //call init()
        ctrl.init();

        expect(ctrl.greeting).toBeNull();

        deferred.resolve('Hello World');

        //not yet...
        expect(ctrl.greeting).toBeNull();

        //"it's important to know that the resolution of promises is tied to the digest cycle"
        $rootScope.$apply();

        //now!
        expect(ctrl.greeting).toBe('Hello World');

    }));

    it('should call console.error on promise reject', inject(function($q, $rootScope) {
        //create promise
        deferred = $q.defer();

        //mock service response (foc...