2016-10-30 3 views
2

Карма продолжает бросать TypeError: Cannot read property 'originalPath' of undefined дал директиву следующим текстом в функции link:Как выполнить модульное измерение Угловой маршрутChangeSuccess в функции директивной ссылки?

angular.module('myApp').directive('sidebar', ['$route', function ($route) 
{ 
    return { 
    restrict: 'E', 
    templateUrl: 'views/sidebar.html', 
    scope: { 
     activeNav: '@' 
    }, 
    link: function (scope, element, attrs) { 
     scope.$on('$routeChangeSuccess', function (event, curr, prev) { 
     scope.activeNav = curr.$$route.originalPath || '/about'; 
     }); 
    } 
} 

и модульного тестирования:

describe('sidebar directive', function() { 
    var $compile, 
    $rootScope, 
    scope, 
    element; 

    beforeEach(module('MyApp')); 
    beforeEach(module('my.templates')); // ng-html2js karma template loader 

    beforeEach(inject(function(_$compile_, _$rootScope_){ 
    $compile = _$compile_; 
    $rootScope = _$rootScope_; 
    scope = $rootScope.$new(); 
    })); 


    it('defaults to /about route', function() { 
    element = $compile("<sidebar></sidebar>")(scope); 
    var linkScope = element.children().scope(); 

    $rootScope.$broadcast('$routeChangeSuccess'); 
    $rootScope.$digest(); 
    expect(linkScope.activeNav).toBe('/about'); 
    }); 
}); 

При входе в curr маршрут внутри звена я получаю Object{params: Object{}, pathParams: Object{}, locals: Object{}}. Я пробовал передать макет маршрута в переданное сообщение, но ничего не изменилось. Как я могу получить ожидаемый (по умолчанию) маршрут для перехода в директиву? Это даже правильный способ отслеживать изменение маршрута в пределах ссылки? Я предполагаю, что я новичок в Jasmine и модульном тестировании.

ответ

0

В конце концов я понял, как вызвать изменение маршрута с использованием $route.reload()

С docs, это:

Причины $ обслуживание маршрута, чтобы перезагрузить текущий маршрут, даже если $ местоположение не изменилось. В результате ngView создает новую область действия и восстанавливает контроллер.

Так добавив, что мой тест «перезагружает» маршрут, заставляя routeChangeSuccess испускать и после того, как переваривается, переходит в link. Вот обновленный блок из файла спецификации с добавленным изменением местоположения $, чтобы проверить другие маршруты:

describe('sidebar directive', function() { 
    var $compile, 
    $rootScope, 
    $route, 
    $location, 
    scope, 
    element; 

    beforeEach(module('MyApp')); 
    beforeEach(module('my.templates')); // ng-html2js karma template loader 

    beforeEach(inject(function(_$compile_, _$rootScope_, _$route_, _$location_){ 
    $compile = _$compile_; 
    $rootScope = _$rootScope_; 
    $location = _$location_; 
    $route = _$route_; 
    scope = $rootScope.$new(); 
    element = $compile("<sidebar></sidebar>")(scope); 
    })); 


    it('defaults to /about route', function() { 
    $route.reload(); 
    $rootScope.$digest(); 
    var linkScope = element.children().scope(); // Get directive's isolated scope 
    expect(linkScope.activeNav).toBe('/about'); 
    }); 

    it('sets activeNave to correct route on change', function() { 
    $location.path('/foo'); 
    $route.reload(); 
    $rootScope.$digest(); 
    var linkScope = element.children().scope(); 
    expect(linkScope.activeNav).toBe('/foo'); 
    }); 
}); 
Смежные вопросы