2014-10-15 3 views
0

Я новичок в работе с угловым ui-router, и я пытаюсь выполнить часть тестирования для базовой проверки подлинности, ее работоспособность до тех пор, пока я не наберу максимальную ошибку стека вызовов.Единичное тестирование углового ui router maximum callstack

Я сузил ошибку до вызова $ state.go в разделе app.run. Я удаляю это, и тестовые работы. Однако это ломает мое приложение

Что я могу сделать, чтобы решить эту проблему? поэтому я могу проверить этот раздел и заставить его работать? Почему это нормально работает, но вызывает ошибку?

Ошибка:

RangeError: Maximum call stack size exceeded 
at Scope.$broadcast (/Users/paulrobinson/Workspace/contactCachePOC/dev/bower_components/angular/angular.js:12876:15) 
at Object.transitionTo (/Users/paulrobinson/Workspace/contactCachePOC/dev/bower_components/angular-ui-router/release/angular-ui-router.js:2584:24) 
at Object.go (/Users/paulrobinson/Workspace/contactCachePOC/dev/bower_components/angular-ui-router/release/angular-ui-router.js:2454:21) 
at /Users/paulrobinson/Workspace/contactCachePOC/dev/js/core.js:9:5889 
at Scope.$broadcast (/Users/paulrobinson/Workspace/contactCachePOC/dev/bower_components/angular/angular.js:12874:28) 
at Object.transitionTo (/Users/paulrobinson/Workspace/contactCachePOC/dev/bower_components/angular-ui-router/release/angular-ui-router.js:2584:24) 
at Object.go (/Users/paulrobinson/Workspace/contactCachePOC/dev/bower_components/angular-ui-router/release/angular-ui-router.js:2454:21) 
at /Users/paulrobinson/Workspace/contactCachePOC/dev/js/core.js:9:5889 
at Scope.$broadcast (/Users/paulrobinson/Workspace/contactCachePOC/dev/bower_components/angular/angular.js:12874:28) 
at Object.transitionTo (/Users/paulrobinson/Workspace/contactCachePOC/dev/bower_components/angular-ui-router/release/angular-ui-router.js:2584:24) 

Код:

app.config(['$stateProvider', '$urlRouterProvider', 
function($stateProvider, $urlRouterProvider){ 
    $urlRouterProvider.otherwise('/'); 
    var access = routingConfig.roles; 
    $stateProvider 
     .state('start', { 
      url   : '/', 
      templateUrl : 'partials/decide.html', 
      controller : 'decideController', 
      data: { 
       access: access.anon 
      } 
     }); 
}]); 

app.run(['$rootScope', '$state', 'AuthService', '$log', '$location', 
function ($rootScope, $state, AuthService, $log, $location) { 

$rootScope.$on("$stateChangeStart", 
    function (event, toState, toParams, fromState, fromParams) { 
    if (!AuthService.isAuthorized(toState.data.access)) { 
     event.preventDefault(); 
     $rootScope.error = null; 
     //STATE.GO is causing the error 
     $state.go('start'); 
     //$location.path('/#/'); 
     return; 

    }  
}); 
}]); 

describe('Test as an anonymous user', function() { 
var $templateCache, $state, $stateParams, $rootScope, $httpBackend, 
AuthService,, $location; 
var roles = { 
    anon: { id: 0, value: 'Public'}, 
    user: { id: 1, value: 'User'} 
}; 

beforeEach(module('app')); 

beforeEach(inject(function(_$templateCache_, _$state_, _$stateParams_, _$rootScope_, _$httpBackend_, 
    _AuthService_, _sessionService_, _$location_) { 
    $templateCache = _$templateCache_; 
    $state = _$state_; 
    $stateParams = _$stateParams_; 
    $rootScope = _$rootScope_; 
    $httpBackend = _$httpBackend_; 
    AuthService = _AuthService_; 
    $location = _$location_; 

    //Fake it and say we're not authorized. 
    spyOn(AuthService, "isAuthorized").andCallFake(function (state){ 
     return false; 
    }); 
})); 


describe('View page.', function() { 
    beforeEach(function() { 
     $state.go('start', { }); 
     $rootScope.$apply(); 
    }); 

    it('Should view page.', function() { 
     expect($state.current.name).toEqual('start'); 
    }); 
}); 

}); 

ответ

0

Максимальный стек вызовов превышено предполагает, что что-то происходит рекурсивно. Я бы предположил, что состояние, которое вы собираетесь «запустить», также не разрешено, поэтому вы снова перенаправляетесь на «запуск» и т. Д.

Вы должны сделать свой AuthService.IsAuthorized возвращает истину в какой-то момент

+0

Вы, сэр, правы, я ставлю консольный журнал перед $ state.go, чтобы получить текущее состояние, и текущее состояние пусто! console.log (JSON.stringify ($ состояние)); LOG: '{"params": {}, "current": {"name": "", "url": "^", "views": null, "abstract": true}, "$ current": { "Я": { "имя": "", "URL": "^", "мнение": нулевая, "абстрактная": истинная}, "решительность": {}, "URL": { "сегменты": [ ""], "PARAMS": {}, "источник": "", "SourcePath": "", "sourceSearch": "", "регулярное выражение": {}, "префикс": ""}, "судоходным" : NULL, "Титулы": {}, "просмотр": {}, "ownParams": [], "путь": [], "включает в себя": { "": истинные}, "местные": { "разрешить" : null, "globals": {"$ stateParams": {}}}}, "transition": null} ' – NiffyDroid

+0

Хммм, но если есть цикл, то почему я могу физически использовать сайт и перейти в другие состояния без браузер постоянно выводит записи журнала? – NiffyDroid

+0

, потому что в вашем реальном сайте ваш сервис аутентификации работает правильно, но в тесте вы подделать authservice всегда возвращает ложь: spyOn (AuthService, «isAuthorized») andCallFake (функция (состояние) { возвращение ложным; }.) – Dan

0

Ok, так что, кажется, ошибка с Ui-маршрутизатором.

Вот решение https://github.com/angular-ui/ui-router/issues/178#issuecomment-49156829

$state.go(toState.name, toParams, {notify: false}).then(function() { 
    $rootScope.$broadcast('$stateChangeSuccess', toState, toParams, fromState, fromParams); 
}); 

Приведенный выше код будет иметь дело с проблемой, не нарушая тесты браузера или блока. Осторожно остерегайтесь https://github.com/angular-ui/ui-router/issues/1348 при использовании этого исправления.

0

Используйте $state.go("main", {}, {notify:false});, чтобы сообщать об ошибке $stateChangeStart.

$state.go("main", {}, {notify:false}); 
Смежные вопросы