Как издеваться/запускать $routeChangeSuccess в Angular модульных тестах?

Учитывая, что обработчик привязан к событию $routeChangeSuccess для обновления свойства title в $rootScope:

$rootScope.$on('$routeChangeSuccess', function (event, current, previous) {
  $rootScope.title = 'My title';
});

в модульных тестах, я ожидаю, что выполнение изменения маршрута обновит свойство title:

it('should set a title on $routeChangeSuccess', function () {
  $location.path('/contacts');
  $rootScope.$apply();

  expect($rootScope.title).toBe('My title');
});

Однако код в обработчике $routeChangeSuccess никогда не выполняется в тестах. Он выполняет штраф и обновляет заголовок при запуске приложения в браузере.

Как я могу запустить событие $routeChangeSuccess в тестах? Есть ли лучший подход к тестированию любого произвольного кода, который привязан к $rootScope. $On ('$ routeChangeSuccess',...) или другие события $routeChange?

Ответы

Ответ 1

Попробуйте отправить событие самостоятельно.

$rootScope.$broadcast('$routeChangeSuccess', eventData);

Ответ 2

Более управляемый поведением подход заключается в фактической навигации с использованием

$location.url() или $location.path()

Чтобы это сработало, вам нужно сделать две вещи в своем тесте:

  • вам нужно ввести $route (даже если вы его не используете). Это связано с тем, что $route добавляет внутренний приемник для $locationChangeStart, но он будет делать это только тогда, когда $route запрашивается где-то (и, следовательно, инициализируется)

  • вам нужно предоставить фиктивную маршрутизацию, к которой вы можете перейти:

    beforeEach(module(function($routeProvider) {
         $routeProvider.when('/somePath', { template: ' ' });
    }));