2013-07-31 8 views
16

Hallo Ich baue eine App mit AngularJS und ich bin im Unit Test Abschnitt fest. Ich weiß, wie man Komponententests für Controller und alle anderen schreibt, aber ich weiß nicht, wie es für routeProvider funktioniert. Ich benutze Jasmine für den Schreibgerätest.Können wir Komponententest für AngularJS routeProvider schreiben?

Mein Routenanbieter sieht so aus;

var app = angular.module('MyApp', ['ngResource']) 

    app.config(function ($routeProvider) { 
     $routeProvider 
      .when('/', { 
      templateUrl: 'app/views/main.html', 
      controller: 'MainCtrl' 
      }) 
      .when('/home/:PartyID', { 
      templateUrl: 'app/views/home.html', 
      controller: 'HomeCtrl' 
      }) 
      .when('/edit/:PartyID', { 
      templateUrl: 'app/views/update_profile.html', 
      controller: 'EditCtrl' 
      }) 
      .when('/route', { 
      templateUrl: 'app/views/route.html', 
      controller: 'RouteCtrl' 
      }) 
      .when('/signup', { 
      templateUrl: 'app/views/signup.html', 
      controller: 'SignupCtrl' 
      }) 
      .when('/login', { 
      templateUrl: 'app/views/login.html', 
      controller: 'LoginCtrl' 
      }) 
      .otherwise({ 
      redirectTo: '/' 
      }); 
}); 

Wie kann ich schreibe für diese routeProvider Unit-Test Jasmin mit?

+1

Ich denke, Sie wollen nicht, Tests für routeProvider schreiben, aber Ihre Urls stattdessen zu überprüfen. Dies ist im Tutorial http://docs.angularjs.org/tutorial/step_07 –

+0

Sie sagen also, dass ich nicht Einheitentest für routeProvider schreiben muss, sondern schreiben Sie End2end-Test, um die URLs zu überprüfen. Recht? – BKM

+0

yeah, routeprovider ist ein Service, der bereits von den eckigen Jungs getestet wurde. Sie verwenden nur eine Instanz, um das Objekt zu ändern, in dem Ihre URLs gespeichert sind. –

Antwort

23

Ja, Sie können, ist die schnelle Antwort und unten ist ein kleines Stück Code, der verwendet und erweitert werden kann, um zu testen, dass Routen Sie zu den Orten bringen, die Sie erwarten würden.

describe('Testing routes', function() { 
    beforeEach(module('windscreens')); 

    var location, route, rootScope; 

    beforeEach(inject(
     function(_$location_, _$route_, _$rootScope_) { 
      location = _$location_; 
      route = _$route_; 
      rootScope = _$rootScope_; 
    })); 

    describe('Login route', function() { 
     beforeEach(inject(
      function($httpBackend) { 
       $httpBackend.expectGET('login') 
       .respond(200); 
      })); 

     it('should load the login page on successful load of /login', function() { 
      location.path('/login'); 
      rootScope.$digest(); 
      expect(route.current.controller).toBe('LoginCtrl') 
     }); 
    });  
}); 
+1

Hallo Nick, danke für dieses geradlinige Beispiel. Das sieht für mich eher nach einem Verhaltenstest als nach einem Unit Test aus. –

+0

Hmmm @GregWang Sie haben einen Punkt. Jasmine ist eher eine BDD-Sprache als TDD. –

14

Keep it simple

describe('Testing Routes', function() { 

// load the controller's module 
beforeEach(module('MyApp')); 

it('should test routes', 
inject(function ($route) { 

    expect($route.routes['/'].controller).toBe('MainCtrl'); 
    expect($route.routes['/'].templateUrl).toEqual('app/views/main.html'); 

    expect($route.routes['/home/:PartyID'].controller).toBe('HomeCtrl'); 
    expect($route.routes['/home/:PartyID'].templateUrl).toEqual('app/views/home.html'); 

    expect($route.routes['/edit/:PartyID'].controller).toBe('EditCtrl'); 
    expect($route.routes['/edit/:PartyID'].templateUrl).toEqual('app/views/update_profile.html'); 

    expect($route.routes['/route'].controller).toBe('RouteCtrl'); 
    expect($route.routes['/route'].templateUrl).toEqual('app/views/route.html'); 

    expect($route.routes['/signup'].controller).toBe('SignupCtrl'); 
    expect($route.routes['/signup'].templateUrl).toEqual('app/views/signup.html'); 

    expect($route.routes['/streamconfigs/:id'].controller).toBe('LoginCtrl'); 
    expect($route.routes['/streamconfigs/:id'].templateUrl).toEqual('app/views/login.html'); 

    expect($route.routes[null].redirectTo).toEqual('/'); 
})); 

}); 
+0

Das hat mir bei einigen Tests sehr geholfen, danke –

Verwandte Themen