AngularJS: модульное тестирование контроллера с множеством внешних зависимостей, выдающее слишком много ошибок - PullRequest
0 голосов
/ 26 декабря 2018

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

Это не кроличья яма зависимостей, с которой у меня есть проблема (что может бытьрешено с помощью BardJS).На каждом этапе пути выдается ошибка.Из которых в настоящее время я сталкиваюсь со следующим:

  1. TypeError: undefined не является объектом (оценка '$ scope.utils.handleError')

Следующее является большимпроект, и я пытаюсь проверить один из его контроллеров:

// controller.js

var myTask = angular.module('myTask',['angularUtils.directives.dirPagination', 'ngCsv']);
myTask.controller('myTaskIndexController', ['$scope', '$routeParams', 'ProgramUser', 'User', 'TaskUser', 'Task', 'TaskResponse', 'ProfileInstance', function($scope, $routeParams, ProgramUser, User, TaskUser, Task, TaskResponse, ProfileInstance){
    this.arrayToObject = function(array,key) {
            var map = {}
            for (var i = 0; i < array.length; i += 1) {
                map[array[i][key]]=array[i];
            }
            return map;
        };

    //callback function defined below as a global var
    cacheGETtaskUserIds(User, function(){  
          //..code 
     };
    $scope.utils.handleError();
}//@end CONTROLLER

Это функция обратного вызова, определенная в 'User'

var taskUserIds;
function cacheGETtaskUserIds(User,callback) {
        if(taskUserIds && taskUserIds.length)
            return callback();

        User.getTaskUserIds( function(taskIdsObj) { 
            taskUserIds = taskIdsObj.taskUserIds;
            return callback();
        });
    }//@:end

Это тестовый файл, я просто хочу проверить this.arrayToObject функцию

// controller.spec.js :

describe('myTask-TaskIndexController', function() {
    beforeEach(angular.mock.module('myTask'));
    var myController;
    var $controller, $rootScope;
    var routeParamsMock, ProgramUserMock, UserMock, TaskUserMock, TaskMock, TaskResponseMock, ProfileInstanceMock;
    beforeEach(inject(function( _$controller_, _$rootScope_){
        $controller = _$controller_;
        $rootScope = _$rootScope_.$new();
        routeParamsMock =  {};
        ProgramUserMock = {};
        //UserMock for User.getTaskUserIds in the global cacheGETtaskUserIds
        UserMock = {    getTaskUserIds: function() {
                            return { 1: 'Beverages', 2: 'Condiments' };
                        }
                 };
        TaskUserMock ={};
        TaskMock = {};
        TaskResponseMock = {};
        ProfileInstanceMock = {};
        myController = $controller('myTaskIndexController', { $scope: $rootScope.$new(), $routeParams: routeParamsMock, ProgramUser: ProgramUserMock, User: UserMock, TaskUser: TaskUserMock, Task: TaskMock, TaskResponse: TaskResponseMock, ProfileInstance: ProfileInstanceMock });
    }));

Эта конфигурация сама по себе выдает ошибки:

PhantomJS 2.1.1 (Mac OS X 0.0.0) ERROR
  {
    "message": "An error was thrown in afterAll\nTypeError: undefined is not an object (evaluating 'c.module')",
    "str": "An error was thrown in afterAll\nTypeError: undefined is not an object (evaluating 'c.module')"
PhantomJS 2.1.1 (Mac OS X 0.0.0) ERROR
  {
    "message": "An error was thrown in afterAll\nTypeError: undefined is not an object (evaluating 'c.module')",
    "str": "An error was thrown in afterAll\nTypeError: undefined is not an object (evaluating 'c.module')"
  }

Не могли бы вы помочь мне со следующим:

  1. Как мне поступитьсоздание модульного теста для такого сложного контроллера?
  2. Существует ли какой-либо метод автоматического издевательства?Скажем, я не хочу тестировать cacheGETtaskUserIds, но мне все еще приходится издеваться над User.getTaskUserIds, почему?
  3. Есть ли проблема с загрузкой файлов?
  4. Существует ли какой-либо современный / более новый / более простой способ тестирования приложений AngularJS 1.x?

Шаблон загрузки файлов Karma.conf.js

files: [
      // module dependencies and angular mocks library
      '../node_modules/babel-polyfill/dist/polyfill.js',  //-->For Promises in PhantomJS
      '../src/lib/angular-1.4/angular-route.min.js',
      '../node_modules/angular/angular.js',
      '../node_modules/angular-mocks/angular-mocks.js',
      '../node_modules/bardjs/bard.js',

      '../src/lib/datatables/js/dirPagination.js',
      '../src/lib/ng-csv/ng-csv.js',
      '../src/app/task/Module.js',
      '../src/app/task/Controller.js',
      //Test files
      {pattern: './app/**/*.js'}
    ],
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...