жасмин тест $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();
    });

});

Моя карма.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
Ваш контроллер, вероятно, зависит от службы с именем settings, которая недоступна, потому что вы забыли загрузить ее модуль или потому что ее JS-файл отсутствует в списке. Выложите код контроллера. Еще подозрительно то, что у вас нет тестового файла в списке файлов конфигурации кармы.   -  person JB Nizet    schedule 22.08.2015
comment
Спасибо @JB Nizet за ваш ответ. Я только что отредактировал свой вопрос и добавил свой контроллер. Но у меня нет службы, которая называла бы настройки в моем проекте, и единственный модуль, от которого зависит мой контроллер, - это myProvider, и он уже добавлен. карма.config.js.   -  person Akino    schedule 22.08.2015
comment
Я бы начал с очистки всех этих зависимостей. Вы импортируете ui-router 3 раза, дезинфицируете 2 раза, angular-routed, несмотря на то, что я думаю, вы используете 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