DowinskiField
DowinskiField

Reputation: 133

Unknown provider: $scopeProvider <- $scope

I am trying to make a small test work that validates wether the controller is defined.

The error I am receiving is:

myApp.orders module Order controller should .... FAILED
    Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope <- OrdersCtrl

Reading similar errors it has something to do with the dependencies, but I don't know what's wrong.

Controller:

'use strict';

angular.module('myApp.orders', ['ngRoute'])

.config(['$routeProvider', function($routeProvider) {
  $routeProvider.when('/orders', {
    templateUrl: 'orders/orders.template.html',
    controller: 'OrdersCtrl'
  });
}])

.controller('OrdersCtrl', function($scope, $location) {
  $scope.changeView = function(view){
    $location.path(view); // path not hash
  }
});

Test:

'use strict';

describe('myApp.orders module', function() {

  beforeEach(module('myApp.orders'));

  describe('Order controller', function(){

    it('should ....', inject(function($controller) {
      //spec body
      var OrdersCtrl = $controller('OrdersCtrl');
      expect(OrdersCtrl).toBeDefined();
    }));

  });
});

Upvotes: 0

Views: 2421

Answers (3)

Shahzad
Shahzad

Reputation: 1705

This is because you are not passing the $scope variabl einside the controller when you are creating it in test. And the controller tries to define $scope.changeView, but it finds $scope as undefined. You need to pass a $scope variable to the controller in your test.

var $rootScope, $scope, $controller;

beforeEach(function() {
    module('myApp.orders');

    inject(function (_$rootScope_, _$controller_) {
        $rootScope = _$rootScope_;
        $scope = _$rootScope_.$new();
        $controller = _$controller_;
    });
});

and in your test,

var OrdersCtrl = $controller('OrdersCtrl', { $scope: $scope });

Upvotes: 2

Manikandan Velayutham
Manikandan Velayutham

Reputation: 2228

Chaneg your controller like this

   .controller('OrdersCtrl',['$scope', '$location', function($scope, $location) {
       $scope.changeView = function(view){
        $location.path(view); // path not hash
      }
    }]);

Upvotes: 0

rrd
rrd

Reputation: 5957

Restructure your unit test slightly. We have a pattern where the controller is defined in the beforeEach() so it's ready for the test. You also need to import the controller you're testing:

import ControllerToTest from 'path/to/your/real/controller';
describe('myApp.orders module',() => {
  let vm;
  beforeEach(() => {
    inject(($controller, $rootScope) => {
      vm = $controller(ControllerToTest,
        {
          $scope: $rootScope.$new()
        };
    });
  });

  describe('Order Controller', () => {
    it('should do something', () => {
      expect(vm).toBeDefined();
    });
  });
});

Upvotes: 0

Related Questions