2013-06-27 27 views
0

我无法使用require和karma为我的AngularJS应用程序编写测试。当我从业力中加载主源文件时,我随机得到'module is not defined'错误,我不确定原因。AngularJS + Require + Karma - 无法运行测试

我的项目结构如下:

main 
-webapp 
-components 
    -{all my external libs} 
-js 
    -{my js files} 
test 
    -lib 
    angular-mocks.js 
    underscore.js 
    -webapp 
    karma.conf.js 
    server.js 
    test-main.js -> require js config 
    -unit 
    myTest.js 

我测试main.js定义如下 -

var tests = []; 
for (var file in window.__karma__.files) { 
if (/Test\.js$/.test(file)) { 
    tests.push(file); 
    console.log(file); 
} 
} 


requirejs.config({ 
baseUrl:'base/', 
paths:{ 
    'angular':'main/webapp/components/angular-1.0.7', 
    'jquery':'main/webapp/components/jquery', 
    'jquery-ui':'main/webapp/components/jquery-ui', 
    'lodash':'main/webapp/components/lodash', 
    'underscore':'test/webapp/lib/underscore', 
    'angular-mocks':'test/webapp/lib/angular-mocks', 
    'requireLibChecker':'test/webapp/checker/requireLibChecker', 
    'bootstrap':'main/webapp/components/bootstrap/js/bootstrap', 
    'bootstrap-datepicker':'main/webapp/components/bootstrap/js/bootstrap-datepicker', 
    'app':'main/webapp/js/mcc', 
    'helper':'main/webapp/js/helper', 
    'js':'main/webapp/js' 
}, 

shim:{ 
    'angular':{ 
     exports:'angular' 
    }, 
    'angular-mocks':{ 
     exports:'angular-mocks' 
    }, 
    'underscore':{ 
     exports:'_' 
    }, 
    'jquery-ui':{ 
     deps:['jquery'], 
     exports:'jquery-ui' 
    }, 
    'bootstrap-datepicker':{ 
     deps:['jquery', 'bootstrap'], 
     exports:'datepicker' 
    } 
}, 
priority:[ 
    "angular" 
], 

// ask Require.js to load these files (all our tests) 
deps:tests, 

priority:['angular'], 


// start test run, once Require.js is done 
callback:window.__karma__.start 
}); 

我的主要的第一源文件(mcc.js)引起的错误当通过业力加载和定义如下:

define("app", [ 
'angular', 
'js/controllers/overviewctrl', 
'js/controllers/topicactivityctrl', 
'js/services/transportmodel', 
'js/services/subjectmodel', 
'js/directives/controlsdirective', 
'bootstrap-datepicker', 
'jquery-ui' 
], function(angular) { 

var app = angular.module('mcc', []).config(['$routeProvider', function ($routeProvider) { 
    $routeProvider. 
     when('/overview', { 
      templateUrl:'partials/system-overview.html', 
      controller: 'OverviewController' 
     }). 
     when('/overview/:systemId', { 
      templateUrl:'partials/system-overview.html', 
      controller: 'OverviewController' 
     }). 
     otherwise({redirectTo:'/overview'}); 
}]); 

app.controller("AppController", ['$rootScope', 'transportModel', function($rootScope, transportModel) { 
    $rootScope.$on("$routeChangeError", function(event, current, previous, rejection) { 
     alert("Route Change Error: " + rejection); 
    }); 

    if ($rootScope.mcc_region === undefined) 
     $rootScope.mcc_region = "New York"; 

    transportModel.then(function(tm) { 
     $rootScope.mcc_regions = tm.regions; 
    }); 

}]); 

return app; 

}); 


require(['angular', 'helper'], function(angular, helper) { 

angular.element(document).ready(function() { 

    /* MANUALLY LOAD TO WAIT FOR APP */ 
    angular.bootstrap(document, ['mcc']); --> This line causes the error 

    /* NAVIGATE TO TOP OF PAGE FOR MOBILE DEVICES */ 
    window.scrollTo(0, 1); 


}); 

}); 

我想调试为什么 -
angular.bootstrap(document,['mcc']); 随机导致的错误 - 也就是说,浏览器(chrome,phantomJS)有时候会找到这个模块,有时候它通过业力运行时不会。如果我把它作为一个普通的网络应用程序运行,它总是第一次正常工作。

回答

0

我不认为你要在执行测试时引导应用程序。你是否试图将该模块重构为另一个文件?例如,当您运行应用程序时,相当于您的test-main.js的文件。

我的意思是,该模块:

require(['angular', 'helper'], function(angular, helper) { 

    angular.element(document).ready(function() { 

     /* MANUALLY LOAD TO WAIT FOR APP */ 
     angular.bootstrap(document, ['mcc']); --> This line causes the error 

     /* NAVIGATE TO TOP OF PAGE FOR MOBILE DEVICES */ 
     window.scrollTo(0, 1); 


}); 

可能并不需要由噶都加载。