jasmine test $scope е недефиниран

Опитвам се да напиша тест за контролер, използвайки карма с жасмин. Получавам тази грешка „Грешка: [$injector:unpr] Unknown SettingsProvider ‹- settings“ Заседнах с часове в гугъл, но не мога да намеря решение за това.

Моят тестов случай

describe('MyController', function() {


     var $scope, controller;

     beforeEach(module('MyApp'));
     beforeEach(inject(function ($rootScope, $controller) {
         $scope = $rootScope.$new();
         controller = $controller('MyController', { 
            $scope: $scope
         });

     }));
     it('sets the options to "valid" if the type is  val', function() {
          var type = 'val';
          $scope.callOptions(type);
          expect($scope.options).toBeTruthy();
    });

});

Моят karma.config.js

 files: [
      'app/bower_components/angular/angular.js',
      'app/bower_components/jquery/dist/jquery.min.js',  
      'app/node_modules/angular-mocks/angular-mocks.js', 
      'app/bower_components/angular-resource/angular-resource.js',  
      'app/bower_components/angular-ui-router/release/angular-ui-router.js',
      'app/bower_components/angular-ui-router/release/angular-ui-router.min.js',
      'app/metronic/assets/global/plugins/angularjs/plugins/angular-ui-router.min.js',
      'app/bower_components/ui-router-extras/release/modular/ct-ui-router-extras.sticky.js',
      'app/bower_components/ngDraggable/ngDraggable.js',
      'app/metronic/assets/global/plugins/angularjs/angular-sanitize.min.js',
      'app/metronic/assets/global/plugins/jquery.min.js',
      'app/metronic/assets/global/plugins/bootstrap/js/bootstrap.min.js',
      'app/metronic/assets/global/plugins/angularjs/plugins/ui-bootstrap-tpls.min.js',


      'app/bower_components/ngstorage/ngStorage.min.js',
      'app/bower_components/oclazyload/dist/ocLazyLoad.min.js',

      'app/metronic/assets/global/plugins/angularjs/plugins/angular-file-upload/angular-file-upload.min.js',

      'app/js/services/myProvider.js',
      'app/js/app.js',      
      'app/controllers/MyController.js'
   ]

Моят контролер:

MetronicApp.controller('MyController',
        ['$http',
            '$rootScope',
            '$scope',
            '$window',
            function ($http, $rootScope, $scope, $window) {

              $scope.callOptions = function (type) {
                    if (type == 'val') {
                        return $scope.optionsVal;
                    }
                    ;
                    if (type == 'Num') {
                        return $scope.optionsNum;
                    }
                    ;

                };
              });

РЕДАКТИРАНЕ

Изтрих някакъв файл от моя karma.config.js и сега получавам тази грешка $scope is undefined .. Това е екранна снимка на грешката: въведете описание на изображението тук


person Akino    schedule 22.08.2015    source източник
comment
Вашият контролер вероятно зависи от услуга, наречена настройки, която не е налична, защото сте забравили да заредите нейния модул или защото нейният JS файл не е в списъка. Публикувайте кода на контролера. Друго подозрително нещо е, че нямате никакъв тестов файл в списъка с файлове на конфигурацията на karma.   -  person JB Nizet    schedule 22.08.2015
comment
Благодаря ти @JB Nizet за твоя отговор. Току-що редактирах въпроса си и добавих своя контролер .. Но нямам услуга, която да наименува настройки в моя проект и единственият модул, от който зависи моят контролер, е myProvider и той вече е добавен karma.config.js.   -  person Akino    schedule 22.08.2015
comment
Бих започнал с почистване на всички тези зависимости. Импортирате ui-router 3 пъти, sanitize 2 пъти, angular-routedespit Предполагам, че използвате ui-router, bootstrap, въпреки че използвате ui-bootstrap, jquery два пъти. Бъркотия е. Просто включете това, от което наистина, наистина се нуждаете.   -  person JB Nizet    schedule 22.08.2015
comment
Просто добавям екранна снимка към моя въпрос @JB Nizet и изтрих всички дублирани файлове   -  person Akino    schedule 22.08.2015


Отговори (1)


Мисля, че начинът, по който сте инжектирали $rootScope и $controller, е неправилен. Моля, опитайте следния кодов фрагмент. Той ще свърши работа.

  describe('MyController', function() {


 var $scope, controller;

 beforeEach(module('MyApp'));
 beforeEach(inject(function ($injector) {
     $scope = $injector.get("$rootScope").$new();
     controller = $injector.get("$controller")('MyController', { 
        $scope: $scope
     });

 }));
 it('sets the options to "valid" if the type is  val', function() {
      var type = 'val';
      $scope.callOptions(type);
      expect($scope.options).toBeTruthy();
});

});

person samyak bhalerao    schedule 25.09.2015