Testing a controller

Answer to SO question

by eitanp461

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

//--- CODE --------------------------
angular.module('controllers', []).controller('profileCtrl', ["$scope", "UserService",

function ($scope, UserService) {
    $scope.current_user = UserService.details(0);
}]);

// --- SPECS -------------------------

describe('profileCtrl', function () {
    var scope, ctrl, userServiceMock;

    beforeEach(function () {
        userServiceMock = jasmine.createSpyObj('UserService', ['details']);
        userServiceMock.details.andReturn('sdfsdf');
        angular.mock.module('controllers');
        angular.mock.inject(function ($rootScope, $controller) {
            scope = $rootScope.$new();
            ctrl = $controller('profileCtrl', {
                $scope: scope,
                UserService: userServiceMock
            });
        });
    });

    it('should have a LoginCtrl controller', function () {
        expect(ctrl).toBeDefined();
    });

    it('should fetch list of users', function () {
        expect(scope.current_user).toBe('sdfsdf');
    });
});

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

    var htmlReporter = new jasmine.HtmlReporter();

    jasmineEnv.addReporter(htmlReporter);

    jasmineEnv.specFilter = function (spec) {
        return htmlReporter.specFilter(spec);
    };

    var currentWindowOnload = window.onload;

    window.onload = function () {
        if (currentWindowOnload) {
            currentWindowOnload();
        }
        execJasmine();
    };

    function execJasmine() {
        jasmineEnv.execute();
    }

})();