StackOverflow Question: Test controller with service injection

http://stackoverflow.com/questions/32766328/test-controller-with-service-injection

by Hari Menon

HTML

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

JavaScript

// CODE

angular.module('octosendApp', [])
    .factory('user', ['$http', '$q', function ($http, $q) {

    var User = function (id) {
        this.id = id;
        this.name = null;
    };

    User.prototype.load = function () {
        var deferred = $q.defer();

        $http.post('/user/' + this.id + '/load')
            .success(function (data) {
            var user = new User(data.id);
            user.name = data.name
            deferred.resolve(user);
        })
            .error(function (err, code) {
            deferred.reject(err);
            $log.error(err, code);
        });
        return deferred.promise;
    };

    return User;
}])
    .controller('UserCtrl', ['$scope', '$routeParams', 'User', function ($scope, $routeParams, User) {

    $scope.hello = "lol";

    $scope.userId = $routeParams.id;
    var user = new User($scope.userId);

    $scope.load = function () {
        user.load().then(function (user) {
            $scope.name = user.name;
        }, function () {
            $scope.dataFail = 'error error';
        });
    };

    $scope.load();
}]);



// SPECS

describe('Controller: UserCtrl', function () {

    var $controller, $scope, User;

    beforeEach(module('octosendApp', function ($provide) {
        // User = jasmine.createSpyObj('User', ['load']);

        // User.load.and.returnValue({
        //   name: 'testName'
        // });

        User = function (id) {
            return {
                load: function () {
                    return {
                        then: function (success, failure) {
                            success({
                                name: 'testUser ' + id
                            });
                        }
                    };
                }
            };
        };

        $provide.value('User', User);
    }));

    beforeEach(inject(function (_$controller_, $rootScope, _User_) {
        $scope = $rootScope.$new();
        User = _User_;

        $controller =...