Angular Karma 测试未 运行 正确,给出错误 "Argument 'fn' is not a function, got undefined"
Angular Karma test not running properly, gives error "Argument 'fn' is not a function, got undefined"
我正在尝试使用 karma 将单元测试添加到 angular 控制器,但我 运行 遇到了问题,我需要一些帮助。我在这里发现了类似的问题,但 none 使我找到了答案。我试过更改 karma.conf.js 中 "files" 数组的顺序,我想也许它们没有被正确加载,但没有产生任何结果。当我 运行 'karma start karma.conf.js' 我得到错误
来自 karma 的控制台错误
Error: [$injector:modulerr] Failed to instantiate module undefined due to:
Error: [ng:areq] Argument 'fn' is not a function, got undefined
at assetArg (D:/xxxx/bower_components/angular/angular.js:1580
...
...
... (long callstack within angular.js and angular-mocks.js)
...
...
at workFn (D:/xxxx/bower_components/angular-mocks/angular-mocks.js:2172
我目前只使用一个测试文件,而且非常基础。模块名称正确,'myApp.views.view1` 文件由 karma 服务器提供服务,"debug" 级别的 karma 日志记录证实了这一点
view1_test.js
'use strict';
describe('myApp.views.view1 module', function() {
beforeEach(module('myApp.views.view1',[]));
describe('view1 controller', function(){
it('should exist....', inject(function($controller) {
//spec body
var view1Ctrl = $controller('View1Ctrl');
expect(view1Ctrl).toBeDefined();
}));
});
});
这是它正在测试的视图控制器
view1.js
'use strict';
angular.module('myApp.views.view1', ['ngRoute'])
.config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/view1', {
templateUrl: 'src/views/view1/view1.html',
controller: 'View1Ctrl'
});
}])
.controller('View1Ctrl', ['$scope','$anchorScroll',function($scope,$anchorScroll) {
//scroll to top of page
$anchorScroll();
$scope.testVar = "it works, congrats!";
}]);
目录结构
/
.bowerrc
.gitignore
bower.json
package.json
karma.conf.js
/sass_styles
base.scss
/app
index.html
/src
app.js
/bower_components
/directives
/example
directive.js
template.html
/views
/view1
view1.html
view1.js
view1_test.js
/styles
base.css
这是我的 karma.conf.js 文件。我使用 PhantomJS 作为浏览器和 html2js 预处理器来包含使用 'templateURL'
的指令 .html 模板
karma.conf.js
module.exports = function(config){
config.set({
basePath : './app/',
preprocessors: {
'src/directives/**/*.html': ['ng-html2js']
},
files : [
'src/bower_components/angular/angular.js',
'src/bower_components/angular-route/angular-route.js',
'src/bower_components/angular-mocks/angular-mocks.js',
'src/directives/**/*.js',
'src/views/**/*.js',
//directive templates
'app/src/directives/**/**.html'
],
autoWatch : true,
// level of logging
// possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
logLevel: config.LOG_DEBUG,
frameworks: ['jasmine'],
browsers : ['PhantomJS'],
plugins : [
'karma-chrome-launcher',
'karma-firefox-launcher',
'karma-phantomjs-launcher',
'karma-jasmine',
'karma-junit-reporter',
'karma-ng-html2js-preprocessor'
],
junitReporter : {
outputFile: '../test_out/unit.xml',
suite: 'unit'
},
ngHtml2JsPreprocessor: {
// strip app from the file path
stripPrefix: 'app/',
stripSufix: '.ext',
// prepend this to the
prependPrefix: 'served/',
// setting this option will create only a single module that contains templates
// from all the files, so you can load them all with module('foo')
moduleName: 'templates'
}
});
};
很抱歉复制粘贴了一大堆东西,但这是一个复杂的过程,我想确保我没有遗漏一小部分。那么我在这里做错了什么导致了这个错误?
问题是,当您在规范文件测试设置中获取模块时,您实际上是通过指定第二个参数来创建它,因此它只是清除在该模块下注册的所有内容。
变化:
beforeEach(module('myApp.views.view1',[]));
到
beforeEach(module('myApp.views.view1'));
并且当您使用 $controller
实例化控制器时,您需要提供作用域,因为您在控制器中注入 $scope
并且不存在 $scopeProvider
一个特殊的依赖注入,所以你需要提供它。
像这样:
it('should exist....', inject(function($controller, $rootScope) {
//spec body
var scope = $rootScope.$new();
var view1Ctrl = $controller('View1Ctrl', {$scope:scope});
expect(view1Ctrl).toBeDefined();
}));
我正在尝试使用 karma 将单元测试添加到 angular 控制器,但我 运行 遇到了问题,我需要一些帮助。我在这里发现了类似的问题,但 none 使我找到了答案。我试过更改 karma.conf.js 中 "files" 数组的顺序,我想也许它们没有被正确加载,但没有产生任何结果。当我 运行 'karma start karma.conf.js' 我得到错误
来自 karma 的控制台错误
Error: [$injector:modulerr] Failed to instantiate module undefined due to:
Error: [ng:areq] Argument 'fn' is not a function, got undefined
at assetArg (D:/xxxx/bower_components/angular/angular.js:1580
...
...
... (long callstack within angular.js and angular-mocks.js)
...
...
at workFn (D:/xxxx/bower_components/angular-mocks/angular-mocks.js:2172
我目前只使用一个测试文件,而且非常基础。模块名称正确,'myApp.views.view1` 文件由 karma 服务器提供服务,"debug" 级别的 karma 日志记录证实了这一点
view1_test.js
'use strict';
describe('myApp.views.view1 module', function() {
beforeEach(module('myApp.views.view1',[]));
describe('view1 controller', function(){
it('should exist....', inject(function($controller) {
//spec body
var view1Ctrl = $controller('View1Ctrl');
expect(view1Ctrl).toBeDefined();
}));
});
});
这是它正在测试的视图控制器
view1.js
'use strict';
angular.module('myApp.views.view1', ['ngRoute'])
.config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/view1', {
templateUrl: 'src/views/view1/view1.html',
controller: 'View1Ctrl'
});
}])
.controller('View1Ctrl', ['$scope','$anchorScroll',function($scope,$anchorScroll) {
//scroll to top of page
$anchorScroll();
$scope.testVar = "it works, congrats!";
}]);
目录结构
/
.bowerrc
.gitignore
bower.json
package.json
karma.conf.js
/sass_styles
base.scss
/app
index.html
/src
app.js
/bower_components
/directives
/example
directive.js
template.html
/views
/view1
view1.html
view1.js
view1_test.js
/styles
base.css
这是我的 karma.conf.js 文件。我使用 PhantomJS 作为浏览器和 html2js 预处理器来包含使用 'templateURL'
的指令 .html 模板karma.conf.js
module.exports = function(config){
config.set({
basePath : './app/',
preprocessors: {
'src/directives/**/*.html': ['ng-html2js']
},
files : [
'src/bower_components/angular/angular.js',
'src/bower_components/angular-route/angular-route.js',
'src/bower_components/angular-mocks/angular-mocks.js',
'src/directives/**/*.js',
'src/views/**/*.js',
//directive templates
'app/src/directives/**/**.html'
],
autoWatch : true,
// level of logging
// possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
logLevel: config.LOG_DEBUG,
frameworks: ['jasmine'],
browsers : ['PhantomJS'],
plugins : [
'karma-chrome-launcher',
'karma-firefox-launcher',
'karma-phantomjs-launcher',
'karma-jasmine',
'karma-junit-reporter',
'karma-ng-html2js-preprocessor'
],
junitReporter : {
outputFile: '../test_out/unit.xml',
suite: 'unit'
},
ngHtml2JsPreprocessor: {
// strip app from the file path
stripPrefix: 'app/',
stripSufix: '.ext',
// prepend this to the
prependPrefix: 'served/',
// setting this option will create only a single module that contains templates
// from all the files, so you can load them all with module('foo')
moduleName: 'templates'
}
});
};
很抱歉复制粘贴了一大堆东西,但这是一个复杂的过程,我想确保我没有遗漏一小部分。那么我在这里做错了什么导致了这个错误?
问题是,当您在规范文件测试设置中获取模块时,您实际上是通过指定第二个参数来创建它,因此它只是清除在该模块下注册的所有内容。
变化:
beforeEach(module('myApp.views.view1',[]));
到
beforeEach(module('myApp.views.view1'));
并且当您使用 $controller
实例化控制器时,您需要提供作用域,因为您在控制器中注入 $scope
并且不存在 $scopeProvider
一个特殊的依赖注入,所以你需要提供它。
像这样:
it('should exist....', inject(function($controller, $rootScope) {
//spec body
var scope = $rootScope.$new();
var view1Ctrl = $controller('View1Ctrl', {$scope:scope});
expect(view1Ctrl).toBeDefined();
}));