Ошибка кармы Аргумент «Контроллер» не является функцией, стал неопределенным

У меня возникла проблема, когда я попытался проверить свой контроллер. Когда я запускаю свой тест, я получаю ошибку

Error: [ng:areq] Argument 'MainCtrl' is not a function, got undefined   http://errors.angularjs.org/1.3.8/ng/areq?p0=MainCtrl&p1=not%20a%20function%2C%20got%20undefined
        at assertArg (/Users/tetianachupryna/project/bower_components/angular/angular.js:1577)
        at assertArgFn (/Users/tetianachupryna/project/bower_components/angular/angular.js:1588)
        at /Users/tetianachupryna/project/bower_components/angular/angular.js:8418
        at /Users/tetianachupryna/project/src/spec/controllers/main-controller.spec.js:11
        at /Users/tetianachupryna/project/src/spec/controllers/main-controller.spec.js:17
        at /Users/tetianachupryna/project/node_modules/karma-jasmine/lib/adapter.js:184
        at http://localhost:9877/karma.js:185
        at http://localhost:9877/context.html:51

Я знаю, что SO полон подобных вопросов. Но я полный ноль в Angular и JS в целом, поэтому эти ответы мне не помогли. Из подобных вопросов на SO я обнаружил, что моя проблема заключается в неправильном определении контроллера, но я до сих пор не могу понять, что я сделал неправильно. У меня есть стек, и я умоляю вас о помощи.

Прежде всего, вот мой файл src/app/index.js, в котором определен мой модуль.

var app = angular.module('myModule', [
  'ngAnimate',
  'ngSanitize',
  'ngResource',
  'ui.router',
  'pascalprecht.translate',
  'thing1',
  'thing2']);

Вот src/app/controllers/main-controller.js

angular.module('myModule').controller('MainCtrl', [
    '$scope',
    '$state',
    function ($scope, $state) {
      $scope.state = $state;
      //***
      $scope.isBigStep = function isBigStep() {
        return $state.$current.step == 3;
      };    
  }]);

И, наконец, файл с тестом src/spec/controllers/main-controller.spec.js

describe('MainCtrl', function() {
  var scope, $state, createController;

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

    createController = function() {
      return $controller('MainCtrl', {
        '$scope': scope
      });
    };
  }));

  it('should make 3 as current step', function() {
    var controller = createController();
    expect(scope.isBigStep()).toBe(true);
  });
});

В конфигурации кармы у меня есть все эти файлы

files: [
      'bower_components/angular/angular.js',
      'bower_components/angular-mocks/angular-mocks.js',
      'src/app/index.js',
      'src/app/controllers/*.js',
      'src/spec/controllers/*.js'
    ],

Для запуска теста я использую плагин karma-runner в RubyMine.

Буду благодарен за любую помощь!


person Tetiana Chupryna    schedule 06.01.2015    source источник
comment
Вам не хватает загрузки модуля. Поставить beforeEach(module('myModule')); перед beforeEach(inject(function ($rootScope, $controller) {?   -  person PSL    schedule 06.01.2015
comment
Спасибо, этот трюк помог. Не могли бы вы дать отдельный ответ, который я мог бы принять?   -  person Tetiana Chupryna    schedule 07.01.2015
comment
Конечно, добавил ответ. Спасибо!!   -  person PSL    schedule 07.01.2015


Ответы (1)


Чего вам не хватает, так это добавить модуль в хук beforeEach для настройки теста. В противном случае контроллер не будет найден. Так что добавьте beforeEach(module('myModule')).

describe('MainCtrl', function() {
  var scope, $state, createController;

  beforeEach(module('myModule')); //<--- Hook module

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

    createController = function() {
      return $controller('MainCtrl', {
        '$scope': scope
      });
    };
  }));

  it('should make 3 as current step', function() {
    var controller = createController();
    expect(scope.isBigStep()).toBe(true);
  });
});
person PSL    schedule 07.01.2015