我试图在现有的角度项目中实施单元测试。为此,我添加了Grunt-Karma
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
中尝试使用module
代替beforeEach
的解决方案。我还要仔细检查我是否包含控制器文件。
app.lol.ctrls
也注入了app
。我试过了beforeEach(module(app.lol.ctrls))
,但这也给出了同样的错误。
非常感谢帮助。
答案 0 :(得分: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>
?
如果没有,请安装角度模拟并包含它。
然后,作为第二步,转到您的测试规范并添加更改beforeEach部分,如下所示:
beforeEach(function(){
module('app.lol.ctrls');
module('ngMockE2E');
});
尝试再次运行测试。如果您像以前一样得到相同的错误,请查看您的grunt文件。 karma包含的文件列表对我来说有点奇怪。也许这也可能是一个问题。求助,这里是我的grunt文件:
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
}
}
我希望,这会帮助您解决一些问题。