asdf_enel_hak
asdf_enel_hak

Reputation: 7650

Defined service method is not called, instead real service's is called

I am following this video tutorial and its source is here.

I am trying to apply this test

Here is my test

describe("InStudentController", function () {
    beforeEach(module("eucngts"));
    var inStudentsController;
    var MyInStudentsService;

    var $scope;
    var $q;
    var deferred;
    beforeEach(function () {

        MyInStudentsService =
            {
                getInStudents: function () {
                    deferred = $q.defer();
                    return deferred.promise;
                }
            };
    });

    beforeEach(inject(function ($controller, $rootScope, _$q_) {
        $q = _$q_; 
        $scope = $rootScope.$new();
        inStudentsController = $controller('InStudentsController', {
            service: MyInStudentsService 
        });
    }));
    it("should request list of inStudents", function () {
        spyOn(MyInStudentsService, "getInStudents").and.callThrough();
        inStudentsController.getPage(); // <-- HERE
        //deferred.resolve();
        $scope.$root.$digest();  
        expect(MyInStudentsService.getInStudents).toHaveBeenCalled();
    });
});

Here is relevant controller code:

            InStudentsController.prototype.getPage = function (criteria) {
                var self = this;
                self.showGrid = true;
                self.service.getInStudents();  

            };

When I call getPage() on test it calls real service method instead of defined in test.

What am I doing wrong?

EDIT

I don't use scope in my controller here is generated code(I use typescript):

function InStudentsController (service) {
        var self = this;
        self.service = service; 
    }

InStudentsController.$inject = ['InStudentsService'];
angular.module("eucngts").controller("InStudentsController", InStudentsController);

Upvotes: 0

Views: 58

Answers (2)

Kirill Slatin
Kirill Slatin

Reputation: 6173

According to your latest update it is clear that the name of dependency is used wrong in the test. It must be InStudentsService instead of service. When using $inject property of controller constructor only that name matters, not the formal parameter name in function. That makes minification possible

  inStudentsController = $controller('InStudentsController', {
        InStudentsService: MyInStudentsService 
    });

Upvotes: 1

mofojed
mofojed

Reputation: 1393

Right now you're not injecting a scope into the controller. I think this:

$scope = $rootScope.$new();
inStudentsController = $controller('InStudentsController', {
    service: MyInStudentsService 
});

Should be this:

$scope = $rootScope.$new();
$scope.service = MyInStudentsService
inStudentsController = $controller('InStudentsController', {
    $scope: $scope
});

But it seems odd passing the service in on the scope. Instead, you should be declaring the controller something like this:

angular.module('myApp')
  .controller('InStudentsController', function ($scope, InStudentsService) {
...
  });

And then the service would be injected like so:

$scope = $rootScope.$new();
inStudentsController = $controller('InStudentsController', {
    $scope: $scope,
    InStudentsService: MyInStudentsService
});

Upvotes: 0

Related Questions