Можем ли мы написать модульный тест для AngularJS routeProvider?

Привет, я создаю приложение с использованием AngularJS, и я застрял в разделе модульного тестирования. Я знаю, как писать модульное тестирование для контроллеров и всего остального, но я не знаю, как это сделать для routeProvider. Я использую Jasmine для написания модульного теста.

Мой провайдер маршрута будет выглядеть так:

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

Как я могу написать модульный тест для этого routeProvider с помощью Jasmine?


person BKM    schedule 31.07.2013    source источник
comment
Я предполагаю, что вы не хотите писать тесты для routeProvider, а вместо этого проверять свои URL-адреса. Это в учебнике docs.angularjs.org/tutorial/step_07.   -  person Eduard Gamonal    schedule 31.07.2013
comment
Итак, вы говорите, что мне не нужно писать модульный тест для routeProvider, а написать тест end2end для проверки URL-адресов. Верно?   -  person BKM    schedule 31.07.2013
comment
да, routeprovider — это сервис, уже протестированный ребятами из angular. вы просто используете экземпляр для изменения объекта, в котором хранятся ваши URL-адреса.   -  person Eduard Gamonal    schedule 31.07.2013
comment
Маршруты модульного тестирования вполне разумны. Намерение состоит не в том, чтобы протестировать $routeProvider (который скоро будет объявлен устаревшим), а в том, чтобы проверить сопоставление между URL-адресом, шаблоном и контроллером. Вот пример.   -  person zhon    schedule 13.09.2013
comment
Модульный тест означает тестирование некоторой внутренней логики модуля вашего кода. Вы пытаетесь протестировать конфигурацию. Это выходит за рамки всех ваших модулей и должно проверяться только в сквозных тестах.   -  person hon2a    schedule 13.12.2014


Ответы (2)


Да, вы можете, это быстрый ответ, и ниже приведен небольшой фрагмент кода, который можно использовать и расширить для проверки того, что маршруты ведут вас в места, которые вы ожидаете.

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')
        });
    });    
});
person Nick Lewis    schedule 23.04.2014
comment
Привет Ник, спасибо за этот прямой пример. Хотя для меня это больше похоже на поведенческий тест, а не на модульный тест. - person Greg Wang; 03.06.2014
comment
Хм, @GregWang, ты прав. Заметьте, Jasmine больше похож на язык BDD, чем на TDD. - person Nick Lewis; 06.06.2014

Будь проще

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

});
person Joey Gutierrez    schedule 13.12.2014