2015-07-22 3 views
0

Это мой код продукции:Тест UI-маршрутизатор и stateChangeStart

myApp.run ($rootScope, $location, AuthService, $state) -> 
    $rootScope.$on '$stateChangeStart', (event, toState, toParams, fromState, fromParams) -> 
    $rootScope.stateChangeStarthasBeenCalled = true 
      if toState.authenticate is true 
      $rootScope.authNecessaryButNotProvided = true 

Часть моего Мой маршрутизатор, где я установил authenticate плоский

.state('auth.profile', 
    url   : 'someURL' 
    templateUrl : 'some.html' 
    controller : 'AuthController' 
    authenticate: true 
) 

Я проверить так:

it 'should have stateChangeStarthasBeenCalled defined', -> 
    mockRootScope.$broadcast("$stateChangeStart", "event", "toState:auth.profile", "toParams", "fromState", "fromParams") 
    expect(mockRootScope.stateChangeStarthasBeenCalled).toBeTruthy()  

it 'should have authNecessaryButNotProvided defined', -> 
    mockRootScope.$broadcast("$stateChangeStart", "event", "toState:auth.profile", "toParams", "fromState", "fromParams") 
    expect(mockRootScope.authNecessaryButNotProvided).toBeTruthy() 

Я хочу проверить объект toState, например toState.authenticate, который я определил в своих маршрутах.

Итак, как необходимое условие, как сообщить stateChangeStart состояние, на которое мы переходим?

В производственном коде работает, как и ожидалось, в тесте нет.

ответ

3

Вы можете вручную задать параметры для события, они будут переданы в обработчик события:

mockRootScope.$broadcast(
    '$stateChangeStart', 
    { name: 'auth.profile', authenticate: true }, // toState 
    {}, // toParams     
    {}, // fromState 
    {} // fromParams 
); 

Они будут появляться в том же порядке, первый аргумент будет зарезервирован для event объекта, хотя:

$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) { 
    // ----------------------------------------^ 
    // first argument "event" is auto-generated 
    console.log(toState.authenticate); // true 
}); 
+0

Редактировать: Не работает! tostate.authenticate не оценивает «истину» в моем случае. Любая идея, как получить доступ к 'toState.authenticate' изнутри теста? '$ rootScope.toState.authenticate' или' $ state.toState.authenticate' является 'undefined'. Кроме того, я не совсем доволен этим solutino, так как я хотел бы проверить настройку 'authenticate' ui-router, вместо этого переопределяя его' $ broadcast'. – nottinhill

+1

Я создал плункер для этого решения здесь: http://plnkr.co/edit/WvlFQJkBWQLnQvDZrJwX?p=preview –

+1

Я не уверен, зачем вам нужно исходное значение свойства authenticate из конфигурации маршрутизатора, когда идея (я полагаю), чтобы проверить, как обработчик событий работает в разных обстоятельствах, вручную указывая разные параметры. Или вы хотите проверить, какое значение определено конфигурацией ui-router? –

Смежные вопросы