Модульный тест 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 2

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
};

Это, вероятно,не решит вашу проблему. Я предполагаю, что вы не включаете код контроллера в тест. Добавьте предупреждение / консоль.войдите в верхнюю часть файла контроллера и повторите тест, чтобы убедиться, что он там.