Testing angular controllers with Jasmine

Testing angular controllers with Jasmine

HTML

<script src="http://jasmine.github.io/1.3/lib/jasmine.js"></script>
<script src="http://jasmine.github.io/1.3/lib/jasmine-html.js"></script>
<link rel="stylesheet" href="http://jasmine.github.io/1.3/lib/jasmine.css">
<script src="http://code.angularjs.org/1.2.9/angular.js"></script>
<script src="http://code.angularjs.org/1.2.9/angular-mocks.js"></script>

JavaScript

(function (angular) {
    var myApp = angular.module('myApp', []);
    
    myApp.service('MyService', function ($q, $timeout) {
        this.initialised = false;
        this.getAll = function () {
            var deferred = $q.defer();
            
            var p1 = $timeout(function () {
              return 'p1_return_value';
            }, 1999);
            
            var p2 = $timeout(function () {
              return 'p2_return_value';
            }, 1800);
            
            return $q.all([p1, p2]);
        };
        
        this.init = function () {
          // Simulate an async action.
          $timeout(function () {
            this.initialised = true;
          }.bind(this), 9001);
        };
    });
})(angular);


describe('service', function () {
    var Subject, $timeout;

    beforeEach(function () {
        module('myApp');
        
        inject(function ($injector) {
            Subject  = $injector.get('MyService');
            $timeout = $injector.get('$timeout');
        });
    });
    
    it('is not initalised before 9001ms', function () {
      Subject.init();
      $timeout.flush(9000);
      expect(Subject.initialised).toEqual(false);
    });
    
    it('is initialised after 9001ms', function () {
      Subject.init();
      $timeout.flush(9001);
      expect(Subject.initialised).toEqual(true);
    });
    
    it('some $q.all thingy returns the expected result', function () {
        Subject.init();
        var response;

        Subject.getAll().then(function (r) {
            response = r;
        });
        
        $timeout.flush(2000);
        
        expect(response).toEqual(['p1_return_value', 'p2_return_value']);
        expect(Subject.initialised).toEqual(false);
    });
});




// --- Runner -------------------------
(function () {
    var jasmineEnv = jasmine.getEnv();
    jasmineEnv.updateInterval = 1000;

    var htmlReporter = new jasmine.HtmlReporter();

    jasmineEnv.addReporter(htmlReporter);

  ...