Аргумент 'fooController' не является функцией, стал неопределенным

Я делаю веб-страницу, и все отлично работает. Ошибок вообще нет.

Но сейчас я решил сделать юнит-тест с помощью Karma и Jasmine.

Почему-то я получаю эту ошибку, когда запускаю свой тест

Error: [ng:areq] Argument 'moduleApp.SearchPageController' is not a function, got undefined

Я также пробовал только SearchPageController, но получаю ту же ошибку.

Чего здесь не хватает??

Route

    angular.module('moduleApp').config(['$routeProvider', function($routeProvider) {

  $routeProvider
    .when('/cmt/complaint/search', {
        templateUrl: 'src/callCenter/page1/searchPage.html',
        controller: 'moduleApp.SearchPageController',
        controllerAs: 'vm'
    })
    .otherwise({ redirectTo: '/' });

}]);

Модульный тест

 describe('Controller: SearchPageController', function () {

 var vm;

 beforeEach(module('moduleApp'));
 beforeEach(inject(function ($controller) {
     vm = $controller('moduleApp.SearchPageController', {}, {});
 }));

 it('should bla bla', function () {

    expect(vm).toBeDefined(); // vm is undefined, probably because of the erro above

 });

});

Контроллер

    angular.module('moduleApp.controller').controller('moduleApp.SearchPageController', SearchPageController);
SearchPageController.$inject = ['$log', '$scope', 'moduleApp.SearchPageService', '$http'];


function SearchPageController($log, $scope, searchPageService, $http) {
    'use strict';

    var vm = this;
    vm.filterOption = 'Account ID';

   }

Конфигурация кармы:

// Karma configuration
m

odule.exports = function(config) {
  config.set({

    // base path that will be used to resolve all patterns (eg. files, exclude)
    basePath: '',


    // frameworks to use
    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
    frameworks: ['jasmine'],


    // list of files / patterns to load in the browser
    files: [
        'angular.js' // yes this is on the same folder, it works
        '../app/app.js',
        '../components/angular-mocks/angular-mocks.js',
        'unit/*.js',
        '..app/src/'
    ],


    // list of files / patterns to exclude
    exclude: [
    ],


    // preprocess matching files before serving them to the browser
    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
    preprocessors: {
    },


    // test results reporter to use
    // possible values: 'dots', 'progress'
    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
    reporters: ['progress'],


    // web server port
    port: 9876,


    // enable / disable colors in the output (reporters and logs)
    colors: true,


    // level of logging
    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
    logLevel: config.LOG_LOG,


    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,


    // start these browsers
    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
    browsers: ['PhantomJS'],


    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: false,

    // Concurrency level
    // how many browser should be started simultaneous
    concurrency: Infinity
    })
   }

person user10059050    schedule 10.07.2018    source источник
comment
если даже мастера из StackOverflow не могут мне помочь, то кто может.   -  person user10059050    schedule 10.07.2018


Ответы (1)


Вы определенно не хотите ссылаться на контроллер с именем модуля:

$routeProvider
.when('/cmt/complaint/search', {
    templateUrl: 'src/callCenter/page1/searchPage.html',
    controller: 'moduleApp.SearchPageController', //<--- this is never correct
    controllerAs: 'vm'
})

Вы всегда получаете доступ к контроллеру, сервису или фабрике по имени, которое было определено:

$routeProvider
.when('/cmt/complaint/search', {
    templateUrl: 'src/callCenter/page1/searchPage.html',
    controller: 'SearchPageController',
    controllerAs: 'vm'
})

Похоже, вы включаете свои тесты ДО включения исходного кода приложения:

// list of files / patterns to load in the browser
files: [
    'angular.js' // yes this is on the same folder, it works
    '../app/app.js',
    '../components/angular-mocks/angular-mocks.js',
    'unit/*.js',
    '..app/src/' //<-- if this is your app source, it should be before tests!
],

Я бы просто переставил последние две записи, но похоже, что вы на самом деле не включаете файлы с оператором '..app/src/'. Вы должны использовать подстановочный знак, чтобы включить все файлы .js:

// list of files / patterns to load in the browser
files: [
    'angular.js' // yes this is on the same folder, it works
    '../app/app.js',
    '../components/angular-mocks/angular-mocks.js',
    '..app/src/**/*.js' //<--- all .js files in folders and subfolders
    'unit/*.js',
],

Как правило, вы хотите, чтобы ваши тесты были самой последней записью в разделе файлов вашей конфигурации.

person Pop-A-Stash    schedule 10.07.2018