2015-01-06 12 views
8

Tôi gặp sự cố khi cố gắng kiểm tra bộ điều khiển của mình. Khi tôi chạy thử nghiệm của mình, tôi gặp lỗiLỗi Karma Đối số 'Bộ điều khiển' không phải là một chức năng, đã được xác định

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 

Tôi biết rằng SO có đầy đủ các câu hỏi tương tự. Nhưng tôi là một tổng số null trong Angular và JS nói chung, vì vậy những câu trả lời không giúp tôi. Từ các câu hỏi tương tự trên SO tôi phát hiện ra rằng vấn đề của tôi là sai định nghĩa của bộ điều khiển nhưng tôi vẫn không thể tìm ra những gì tôi đã làm sai. Tôi đã xếp chồng và tôi cầu xin sự giúp đỡ của bạn.

Trước hết ở đây là tôi src/app/index.js tập tin mà mô-đun của tôi được định nghĩa

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

Đây là src/app/controllers/chính-controller.js

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

Và cuối cùng là tệp này có kiểm tra 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); 
    }); 
}); 

Trong nghiệp cấu hình tôi có tất cả các tập tin

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

Đối với chạy thử nghiệm của tôi, tôi sử dụng plugin nghiệp-runner trong RubyMine.

Tôi rất biết ơn sự giúp đỡ của bạn!

+2

Bạn đang thiếu tải mô-đun. Đặt 'beforeEach (module ('myModule'));' before 'beforeEach (inject (function ($ rootScope, $ controller) {'? – PSL

+0

Cảm ơn, mẹo này đã giúp. Bạn có thể tạo một câu trả lời độc lập mà tôi có thể chấp nhận không? –

+0

Chắc chắn thêm một câu trả lời. – PSL

Trả lời

13

Điều bạn đang thiếu là thêm mô-đun vào móc trước khi thiết lập thử nghiệm. Nếu không, bộ điều khiển sẽ không được tìm thấy. Vì vậy, hãy thêm 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); 
    }); 
}); 
Các vấn đề liên quan