2013-09-30 2 views
4

Привет Я создаю приложение, используя AngularJS, и теперь я нахожусь на модуле, тестирующем мое приложение. Я знаю, как писать единичные тестовые примеры для служб, контроллеров и т. Д. Но я не знаю, написать это для $routeChangeStart.

У меня следующий код в моем app.js

app.run(function ($rootScope, $location, AuthenticationService) { 
    $rootScope.$on('$routeChangeStart', function() { 
     if (AuthenticationService.isLoggedIn()) { 
      $rootScope.Authenticated = 'true'; 
      $rootScope.Identity = localStorage.getItem('identification_id'); 
     } else { 
      $rootScope.Authenticated = 'false'; 
      $rootScope.Identity = localStorage.removeItem('identification_id'); 
     } 
    }); 
}); 

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

app.factory('AuthenticationService', function (SessionService) { 
    return { 
     isLoggedIn: function() { 
      return SessionService.get('session_id'); 
     } 
    }; 
}); 

И мой сеансовый сервис нравится;

app.factory('SessionService', function() { 
    return { 
     get: function (key) { 
      return localStorage.getItem(key); 
     } 
    }; 
}); 

Я использую Jasmine писать тестовые случаи и с использованием Istanbul для покрытия кода. Когда я запускаю свой тест с помощью Grunt, я получаю что-то вроде этого в своем приложении app.js;

enter image description here

Это потому, что я не перекрыто эти заявления в моих тестах я не знаю, как написать тестовый пример для этой конкретной части коды. Какие-либо предложения?

+0

У вас есть маршрут, определенный в вашем приложении? –

ответ

8

Блок run выполняется каждый раз, когда модуль загружен, чтобы слушатель регистрировался во время испытаний. Вам просто нужно, чтобы это событие было отправлено, чтобы вы могли протестировать код внутри него. Нечто подобное должно сделать трюк:

it("should test the $routeChangeStart listener", inject(function($rootScope) { 
    $rootScope.$broadcast("$routeChangeStart"); 
    //expects for the listener 
})); 

How can I test events in angular? Смотрите на как проверить события в целом.

2

Хороший способ тестирования $rootScope.$on('$routeChangeStart',... можно найти в модульных тестах самих углов. Это отличный источник знаний, поскольку каждая функция тестируется, поэтому можно найти хорошие решения. Вот почему модульный тест настолько велик, не так ли?

https://github.com/angular/angular.js/blob/master/test/ngRoute/routeSpec.js

Следующий тест (из угловой головки 1.2.x - перейдите по ссылке на последний) отлично работает, вы просто должны адаптироваться к тесту (как обработчик события уже в вашем коде):

'use strict'; 

describe('$route', function() { 
    var $httpBackend; 

    beforeEach(module('ngRoute')); 

    beforeEach(module(function() { 
    return function(_$httpBackend_) { 
     $httpBackend = _$httpBackend_; 
     $httpBackend.when('GET', 'Chapter.html').respond('chapter'); 
     $httpBackend.when('GET', 'test.html').respond('test'); 
     $httpBackend.when('GET', 'foo.html').respond('foo'); 
     $httpBackend.when('GET', 'baz.html').respond('baz'); 
     $httpBackend.when('GET', 'bar.html').respond('bar'); 
     $httpBackend.when('GET', 'http://example.com/trusted-template.html').respond('cross domain trusted template'); 
     $httpBackend.when('GET', '404.html').respond('not found'); 
    }; 
    })); 

    it('should route and fire change event', function() { 
    var log = '', 
     lastRoute, 
     nextRoute; 

    module(function($routeProvider) { 
     $routeProvider.when('/Book/:book/Chapter/:chapter', 
      {controller: angular.noop, templateUrl: 'Chapter.html'}); 
     $routeProvider.when('/Blank', {}); 
    }); 
    inject(function($route, $location, $rootScope) { 
     $rootScope.$on('$routeChangeStart', function(event, next, current) { 
     log += 'before();'; 
     expect(current).toBe($route.current); 
     lastRoute = current; 
     nextRoute = next; 
     }); 
     $rootScope.$on('$routeChangeSuccess', function(event, current, last) { 
     log += 'after();'; 
     expect(current).toBe($route.current); 
     expect(lastRoute).toBe(last); 
     expect(nextRoute).toBe(current); 
     }); 

     $location.path('/Book/Moby/Chapter/Intro').search('p=123'); 
     $rootScope.$digest(); 
     $httpBackend.flush(); 
     expect(log).toEqual('before();after();'); 
     expect($route.current.params).toEqual({book:'Moby', chapter:'Intro', p:'123'}); 

     log = ''; 
     $location.path('/Blank').search('ignore'); 
     $rootScope.$digest(); 
     expect(log).toEqual('before();after();'); 
     expect($route.current.params).toEqual({ignore:true}); 

     log = ''; 
     $location.path('/NONE'); 
     $rootScope.$digest(); 
     expect(log).toEqual('before();after();'); 
     expect($route.current).toEqual(null); 
    }); 
    }); 
Смежные вопросы