Хорошо, вот в чем дело.Я проверил учебные пособия, документацию и другие статьи с людьми, у которых было много проблем во время модульного тестирования контроллеров с большим количеством зависимостей.
Это не кроличья яма зависимостей, с которой у меня есть проблема (что может бытьрешено с помощью BardJS).На каждом этапе пути выдается ошибка.Из которых в настоящее время я сталкиваюсь со следующим:
- 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')"
}
Не могли бы вы помочь мне со следующим:
- Как мне поступитьсоздание модульного теста для такого сложного контроллера?
- Существует ли какой-либо метод автоматического издевательства?Скажем, я не хочу тестировать cacheGETtaskUserIds, но мне все еще приходится издеваться над User.getTaskUserIds, почему?
- Есть ли проблема с загрузкой файлов?
- Существует ли какой-либо современный / более новый / более простой способ тестирования приложений 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'}
],