2016-10-30 2 views
2

Karma hält werfen TypeError: Cannot read property 'originalPath' of undefined eine Anweisung mit folgenden in der link Funktion gegeben:Wie Unit-Test Winkel routeChangeSuccess in Directive Link-Funktion?

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'; 
     }); 
    } 
} 

und Unit-Test:

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'); 
    }); 
}); 

Wenn der curr Weg aus der Verbindung I Object{params: Object{}, pathParams: Object{}, locals: Object{}} bekommen anmelden. Ich habe versucht, eine falsche Route zu der gesendeten Nachricht zu übergeben, aber nichts hat sich geändert. Wie bekomme ich die erwartete (Standard) Route in die Richtlinie? Ist dies der richtige Weg, um eine Routenänderung innerhalb eines Links zu verfolgen? Meine Vermutung ist, dass ich nur neu in Jasmine und Unit Testing bin.

Antwort

0

ich schließlich herausgefunden, wie die Route ändern $route.reload()

Vom docs, es mit triggern:

Ursachen $ Dienstweg die aktuelle Route selbst wenn $ Lage hat sich nicht geändert neu zu laden. Als Ergebnis erstellt ngView einen neuen Bereich und stellt den Controller wieder her.

das meinem Test So Hinzufügen ‚Neustarts‘ der Weg und zwingt routeChangeSuccess zu emittieren und einmal verdaut, gelangt in den link. Hier ist der aktualisierte Block aus der Spec-Datei mit einer zusätzlichen $ location change, um andere Routen zu testen:

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'); 
    }); 
});