Ответ 1
Попробуйте отправить событие самостоятельно.
$rootScope.$broadcast('$routeChangeSuccess', eventData);
Учитывая, что обработчик привязан к событию $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?
Попробуйте отправить событие самостоятельно.
$rootScope.$broadcast('$routeChangeSuccess', eventData);
Более управляемый поведением подход заключается в фактической навигации с использованием
$location.url()
или $location.path()
Чтобы это сработало, вам нужно сделать две вещи в своем тесте:
вам нужно ввести $route (даже если вы его не используете). Это связано с тем, что $route добавляет внутренний приемник для $locationChangeStart, но он будет делать это только тогда, когда $route запрашивается где-то (и, следовательно, инициализируется)
вам нужно предоставить фиктивную маршрутизацию, к которой вы можете перейти:
beforeEach(module(function($routeProvider) {
$routeProvider.when('/somePath', { template: ' ' });
}));