12

I have the following controller:

angular.module('samples.controllers',[])
  .controller('MainCtrl', ['$scope', 'Samples', function($scope, Samples){
  //Controller code
}

Which dependent on the following service:

angular.module('samples.services', []).
    factory('Samples', function($http){
    // Service code
}

Tried to test the controller using the following code:

describe('Main Controller', function() {
  var service, controller, $httpBackend;

  beforeEach(module('samples.controllers'));
  beforeEach(module('samples.services'));
  beforeEach(inject(function(MainCtrl, Samples, _$httpBackend_) {

  }));

    it('Should fight evil', function() {

    });
});

But got the following error:

Error: Unknown provider: MainCtrlProvider <- MainCtrl.

P.s Tried the following post, didn't seem to help

1 Answer 1

27

The correct way to test controllers is to use $controller as such:

ctrl = $controller('MainCtrl', {$scope: scope, Samples: service});

Detailed example:

describe('Main Controller', function() {
  var ctrl, scope, service;

  beforeEach(module('samples'));

  beforeEach(inject(function($controller, $rootScope, Samples) {
    scope = $rootScope.$new();
    service = Samples;

    //Create the controller with the new scope
    ctrl = $controller('MainCtrl', {
      $scope: scope,
      Samples: service
    });
  }));

  it('Should call get samples on initialization', function() {

  });
});
Sign up to request clarification or add additional context in comments.

2 Comments

The reason you can't load a controller as dependency is because the controllers are held inside a registry and don't have a provider. That's why you get the above error.. Only values / constants / factories / services can be loaded as dependencies.
@ShaiRez, thanks so much. I was messing with this for hours and then I read your comment for about the 3rd time and it clicked! Thanks again.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.