Я новичок в работе с угловым 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');
});
});
});
Вы, сэр, правы, я ставлю консольный журнал перед $ 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
Хммм, но если есть цикл, то почему я могу физически использовать сайт и перейти в другие состояния без браузер постоянно выводит записи журнала? – NiffyDroid
, потому что в вашем реальном сайте ваш сервис аутентификации работает правильно, но в тесте вы подделать authservice всегда возвращает ложь: spyOn (AuthService, «isAuthorized») andCallFake (функция (состояние) { возвращение ложным; }.) – Dan