2014-11-18 4 views
0

Мой сайт имеет

$rootScope.$broadcast('task1-completed', service.options.language); 

, который затем вызывает

$rootScope.$on('task1-completed', function() { 
    if (!$rootScope.$$phase) { 
     $rootScope.$digest(); 
    } 
}); 

Тесты блок работает нормально для $broadcast и $on, но как я могу проверить внутреннюю функцию? Aka make $rootScope.$$phase false, так что $digest() получил вызов ...

Я попытался высмеять весь объект $rootScope, но не смог получить что-либо работающее таким образом. Это больше для целей кодирования кода, так как модуль тестирует все нормально. Любая помощь приветствуется! Заранее спасибо!

+0

Что такое Угловое событие, не находясь в '$ digest'? Вы уверены, что '$ rootScope. $ Digest()' * ever * вызывается в вашем производственном коде? –

+0

@ DavinTryon Я не уверен на 100%, что эта конкретная строка когда-либо называется в prod, но избыточность никогда никого не повредит, не так ли? – Timothy

+1

Зачем хранить и тестировать код, который никогда не используется? –

ответ

0

я был в состоянии решить эту проблему, просто изменив $on к ..

$scope.onUpdate = function() { 
    if (!$rootScope.$$phase) { 
     $rootScope.$digest(); 
    } 
}; 

$rootScope.$on('task1-completed', function() { 
    $scope.onUpdate(); 
}); 

Таким образом, я могу проверить блок, если заявление, без фактического кода, который называет его, что делает $$phase ложным и обеспечивает $digest() называется.

0

Недвижимость с префиксом $$ в Angular считаются закрытыми и не подлежит ответственности; это детали реализации, которые могут измениться в любое время.

Из документов: https://docs.angularjs.org/api

AngularJS префиксы $ и $$: Для предотвращения случайного совпадения имен с кодом, AngularJS префиксы имен государственных объектов с $ и имена частных объектов с $$ ...

Безопасный и приемлемый способ для достижения этой цели - $scope.$evalAsync().

Docs on $evalAsync

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

$rootScope.$evalAsync(() => { 
    $rootScope.$broadcast('task1-completed', service.options.language); 
}) 
Смежные вопросы