Модульный тест angularjs контроллер
Я просматривал бесчисленное множество сообщений об этом, но не могу заставить модульный тест моего углового контроллера работать.
Ошибка:
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);
}));
});
Из всех учебников, которые я читал или смотрел, и всей документации я не вижу ошибки. Любая помощь высоко ценится!
Конфигурация кармы:
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'
],
})}
1 ответ:
Во-первых, вы определяете Метод
get
на $scope, а не на контроллере. Поэтому ваш тест должен быть:var scope = $rootScope.$new(); var controller = $controller("CorrMatrixCtrl", {AnalysisFactory: fakeFactory, $scope: scope}); expect(angular.isFunction(scope.get)).toBe(true);
Если вы хотите определить его на контроллере, ваш код контроллера должен быть:
this.get = function() { //something };
Это, вероятно,не решит вашу проблему. Я предполагаю, что вы не включаете код контроллера в тест. Добавьте предупреждение / консоль.войдите в верхнюю часть файла контроллера и повторите тест, чтобы убедиться, что он там.