Подтвердить что ты не робот

Тестирование модуля маршрута angularjs

Как мы видим здесь в http://docs.angularjs.org/tutorial/step_07,

angular.module('phonecat', []).
  config(['$routeProvider', function($routeProvider) {
  $routeProvider.
      when('/phones', {templateUrl: 'partials/phone-list.html',   controller: PhoneListCtrl}).
      when('/phones/:phoneId', {templateUrl: 'partials/phone-detail.html', controller: PhoneDetailCtrl}).
      otherwise({redirectTo: '/phones'});
}]);

Тест маршрутизации рекомендуется проводить с тестом e2e,

  it('should redirect index.html to index.html#/phones', function() {
    browser().navigateTo('../../app/index.html');
    expect(browser().location().url()).toBe('/phones');
  });

Однако, я думаю, что конфигурация "$ routeProvider" выполняется с помощью одной функции, функции ($ routeProvider), и мы должны иметь возможность unit test без участия браузера, поскольку я считаю, что функция маршрутизации не требует браузера DOM.

Например,
когда url is/foo, templateUrl должен быть /partials/foo.html, а контроллер - FooCtrl
когда url is/bar, templateUrl должен быть /partials/bar.html, а контроллер - BarCtrl

Это простая функция IMO, и она также должна быть протестирована в простом тесте unit test.

Я googled и искал этот $routeProvider unit test, но пока не удался.

Я думаю, что я могу взять у него какой-то код, но не смог его сделать, https://github.com/angular/angular.js/blob/master/test/ng/routeSpec.js.

4b9b3361

Ответ 1

Почему бы просто не утверждать, что объект маршрута настроен правильно?

it('should map routes to controllers', function() {
  module('phonecat');

  inject(function($route) {

    expect($route.routes['/phones'].controller).toBe('PhoneListCtrl');
    expect($route.routes['/phones'].templateUrl).
      toEqual('partials/phone-list.html');

    expect($route.routes['/phones/:phoneId'].templateUrl).
      toEqual('partials/phone-detail.html');
    expect($route.routes['/phones/:phoneId'].controller).
      toEqual('PhoneDetailCtrl');

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

Ответ 2

Я думаю, вы должны проверить тест $routeProvider следующим образом:

angular.module('phonecat', []).
  config(['$routeProvider', function($routeProvider) {
  $routeProvider.
      when('/phones', {templateUrl: 'partials/phone-list.html',   controller: PhoneListCtrl}).
      when('/phones/:phoneId', {templateUrl: 'partials/phone-detail.html', controller: PhoneDetailCtrl}).
      otherwise({redirectTo: '/phones'});
}]);


it('should test routeProvider', function() {
  module('phonecat');

  inject(function($route, $location, $rootScope) {

    expect($route.current).toBeUndefined();
    $location.path('/phones/1');
    $rootScope.$digest();

    expect($route.current.templateUrl).toBe('partials/phone-detail.html');
    expect($route.current.controller).toBe(PhoneDetailCtrl);

    $location.path('/otherwise');
    $rootScope.$digest();

    expect($location.path()).toBe('/phones/');
    expect($route.current.templateUrl).toEqual('partials/phone-list.html');
    expect($route.current.controller).toBe(PhoneListCtrl);

  });
}); 

Ответ 3

Объединяя два предыдущих ответа, если вы хотите протестировать маршрутизатор как черный ящик, который успешно маршрутизируется там, где он должен (а не сам конфигуратор конфигурации), независимо от того, какие маршруты могут быть:

// assuming the usual inject beforeEach for $route etc.
var expected = {};
it('should call the right controller for /phones route', function () { 
    expected.controller = $route.routes['/phones'].controller;
    $location.path('/phones');
    $rootScope.$digest();
    expect($route.current.controller).toBe(expected.controller);
});

it('should redirect to redirectUrl from any other route', function () {
    expected.path = $route.routes[null].redirectTo;
    $location.path('/wherever-wrong');
    $rootScope.$digest();
    expect($location.path()).toBe(expected.path);
});