2015-12-02 66 views
0

我試圖在現有的角度項目中實現單元測試。對於我添加咕嚕-噶運行單元測試:Karma + Jasmine給出了未定義的函數`controller` error

karma: 
     unit: 
      options: 
       frameworks: ['jasmine'], 
       singleRun: true, 
       browsers: ['PhantomJS'], 
       files: [bower js files + project dev/test js files] 

控制器是,

angular.module('app.lol.ctrls', []).controller('LOLCtrl', [ 
    '$scope', '$filter', 'Resource', '$log', function($scope, $filter, Resource, $log) {//some logic} 

和測試規範是

describe('Controller: LOLCtrl', function() { 
    beforeEach(module('app')); 

    var OrderCtrl; 
    var scope; 
    var filter; 
    var log; 
    var resource=someResourceWithSomeDataFunc; 

    beforeEach(inject(function ($controller, $rootScope, $filter, $log) { 
     scope = $rootScope.$new(); 
     OrderCtrl = $controller('LOLCtrl', { 
      $scope: scope, 
      $filter: filter, 
      Resource: resource, 
      $log: log 
     }); 
    })); 

    it('should have lolVar to be undefined', function() { 
     expect(scope.lolVar).toBeUndefined(); 
    }); 
}); 

當我運行測試,我得到錯誤

PhantomJS 1.9.8 (Linux 0.0.0) Controller: LOLCtrl should have lolVar to be undefined FAILED 
    Error: [ng:areq] Argument 'LOLCtrl' is not a function, got undefined 
    http://errors.angularjs.org/1.3.20/ng/areq?p0=LOLCtrl&p1=not%20a%20function%2C%20got%20undefined 
    undefined 
     at assertArg .... 

我嘗試了像使用angular.mock.module而不是modulebeforeEach。另外我還檢查了我是否包含控制器文件。 另外app.lol.ctrls注入app本身。我試過beforeEach(module(app.lol.ctrls)),但是這也給出了同樣的錯誤。 幫助將不勝感激。

回答

0

首先我想你忘了包含模塊的依賴關係。不知道你的應用程序代碼的完整結構,我想這代碼,在那裏你定義您的控制器應

angular.module('app.lol.ctrls', ['app.lol', '/*maybe other dependecies*/']).controller('LOLCtrl', [ ]); 

還是你有自己的模塊文件?那麼它應該看起來像這樣:

angular.module('app.lol.ctrls').controller('LOLCtrl', [ ]); 

解決這些依賴性問題後,看看你的index.html。您是否包含
<script src="bower_components/angular-mocks/angular-mocks.js"></script>
如果沒有,請安裝angular-mocks幷包含它。

然後,作爲第二步,去你的測試規範,並添加改變beforeEach部分是這樣的:

beforeEach(function(){ 
    module('app.lol.ctrls'); 
    module('ngMockE2E'); 
}); 

嘗試再次運行測試。如果你像以前一樣得到相同的錯誤,那麼看看你的grunt文件。包含在karma中的文件列表對我來說看起來有點奇怪。也許這也可能是一個問題。如需幫助,這裏是從我的咕嚕文件剪斷:

karma: { 
     options: { 
      frameworks: ['jasmine'], 
      files: [ 
       '<%= dom_munger.data.appjs %>', 
        //this files data is also updated in the watch handler, if updated change there too 
        'bower_components/angular-mocks/angular-mocks.js', 
        'application/**/*-spec.js', 
        'application/**/*.html', 
        'base/**/*-spec.js', 
        'error/**/*.html', 
        'html/**/*.html', 
        '*.html', 
        'bower_components/**/*.html' 
      ], 
      preprocessors: { 
       '**/*.html': ['ng-html2js'] 
      }, 
      ngHtml2JsPreprocessor: { 
       moduleName: 'templates' 
      }, 
      logLevel: 'WARN', 
      reporters: ['mocha'], 
      captureConsole: true, 
      autoWatch: false, 
      singleRun: true 
     } 
    } 

我希望,這將幫助你一點點解決問題。

相關問題