我一直在寻找无数的SO帖子,但无法对我的角度控制器进行单元测试。
错误:
TypeError: Object #<Object> has no method 'apply'
Error: [ng:areq] Argument 'CorrMatrixCtrl' is not a function, got undefined
http://errors.angularjs.org/1.2.14/ng/areq?p0=CorrMatrixCtrl&p1=not%20a%20function%2C%20got%20undefined
at /home/sebastian/gutenberg-for-good/app/lib/angular/angular.js:78:12
at assertArg (/home/sebastian/gutenberg-for-good/app/lib/angular/angular.js:1402:11)
at assertArgFn (/home/sebastian/gutenberg-for-good/app/lib/angular/angular.js:1412:3)
at /home/sebastian/gutenberg-for-good/app/lib/angular/angular.js:6881:9
at null.<anonymous> (/home/sebastian/gutenberg-for-good/test/unit/controllersSpec.js:28:20)
at Object.invoke (/home/sebastian/gutenberg-for-good/app/lib/angular/angular.js:3762:17)
at workFn (/home/sebastian/gutenberg-for-good/test/lib/angular/angular-mocks.js:2144:20)
Error: Declaration Location
at window.inject.angular.mock.inject (/home/sebastian/gutenberg-for-good/test/lib/angular/angular-mocks.js:2129:25)
at null.<anonymous> (/home/sebastian/gutenberg-for-good/test/unit/controllersSpec.js:26:33)
at /home/sebastian/gutenberg-for-good/test/unit/controllersSpec.js:1:1
控制器:
angular.module('gutenberg.controllers', ['ui.bootstrap'])
.controller('CorrMatrixCtrl', ['AnalysisFactory', '$scope', function(AnalysisFactory, $scope){
$scope.get = function() {
//something
};
}]);
测试
describe("corrMatrixCtrl test", function() {
var fakeFactory = {
// some code
};
beforeEach(angular.module("gutenberg.controllers"));
it("should have a get method", inject(function($controller, $rootScope) { // line 26
var controller = $controller("CorrMatrixCtrl", {AnalysisFactory: fakeFactory, $scope: $rootScope.$new()}); // line 28
expect(angular.isFunction(controller.get)).toBe(true);
}));
});
从我阅读或观看过的所有教程以及所有文档中我都看不到错误。任何形式的帮助都非常感谢!
Karma配置:
module.exports = function(config){
config.set({
basePath : '../',
files : [
'app/lib/angular/angular.js',
'app/lib/angular/angular-*.js',
'test/lib/angular/angular-mocks.js',
'app/js/**/*.js',
'test/unit/controllersSpec.js'
],
exclude : [
'app/lib/angular/angular-loader.js',
'app/lib/angular/*.min.js',
'app/lib/angular/angular-scenario.js'
],
autoWatch : true,
frameworks: ['jasmine'],
browsers : ['Chrome'],
plugins : [
'karma-chrome-launcher',
'karma-firefox-launcher',
'karma-jasmine'
],
})}
答案 0 :(得分:1)
首先,您在$ scope上定义get
方法,而不是在控制器上定义。所以你的测试应该是:
var scope = $rootScope.$new();
var controller = $controller("CorrMatrixCtrl", {AnalysisFactory: fakeFactory, $scope: scope});
expect(angular.isFunction(scope.get)).toBe(true);
如果要在控制器上定义它,您的控制器代码应为:
this.get = function() {
//something
};
但这可能并不能解决你的问题。我的猜测是你没有在测试中包含控制器代码。在控制器文件的顶部添加alert / console.log并重新运行测试以确保它在那里。