2015-01-06 11 views
8

Mam problem, gdy próbowałem przetestować kontroler. Po uruchomieniu testu otrzymałem komunikat o błędzieBłąd karmy Argument "Kontroler" nie jest funkcją, ale nieokreślony

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 

Wiem, że SO zawiera wiele podobnych pytań. Ale w Angular i JS mam całkowitą wartość zerową, więc te odpowiedzi mi nie pomogły. Z podobnych pytań na temat SO odkryłem, że mój problem leży w złej definicji kontrolera, ale wciąż nie mogę zrozumieć, co zrobiłem źle. Mam stack i błagam o twoją pomoc.

Przede wszystkim Oto mój src/app/index.js plik gdzie mój moduł jest zdefiniowany

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

Oto 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; 
     };  
    }]); 

I wreszcie ten plik z testem 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); 
    }); 
}); 

w karmę config mam wszystkie te pliki

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' 
    ], 

Aby uruchomić mój testu używam wtyczki karma-runner w rubymine.

Byłbym wdzięczny za każdą pomoc!

+2

Brakuje ci obciążenia modułu. Umieść 'beforeEach (module ('myModule'));' before' beforeEach (inject (function ($ rootScope, $ controller) {'? – PSL

+0

Dzięki, ta sztuczka pomogła.Możesz zrobić samodzielną odpowiedź, którą mógłbym zaakceptować? –

+0

Sure dodano odpowiedź. – PSL

Odpowiedz

13

To, czego brakuje, to dodanie modułu w haczyku beforeEach do konfiguracji testu. W przeciwnym razie kontroler nie zostanie znaleziony. Dodaj więc 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); 
    }); 
}); 
Powiązane problemy