Ответ 1
Я исправил эту проблему, вернув preventDefault
spyOn($rootScope, '$broadcast').and.returnValue({preventDefault: true})
У меня есть такая функция:
$scope.doIt = function( x, y )
{
$timeout( function ()
{
$rootScope.$broadcast( 'xxx',
{
message: xxx,
status: xxx
} );
} );
}
Эта функция работает до сих пор. Но при написании теста у меня были проблемы.
describe( 'test doIt function...', function ()
{
var $rootScope, $timeout;
beforeEach( inject( function ( _$rootScope_, _$timeout_ )
{
$rootScope = _$rootScope_;
$timeout = _$timeout_;
spyOn( $rootScope, '$broadcast' );
spyOn( scope, 'doIt' ).and.callThrough();
} ) );
it( 'test broadcast will be called', inject( function ()
{
var testObj = {
message: 'test1',
status: 'test2'
};
scope.doIt( 'test1', 'test2' );
expect( $rootScope.$broadcast ).not.toHaveBeenCalledWith( 'xxx', testObj );
$timeout.flush();
expect( $rootScope.$broadcast ).toHaveBeenCalledWith( 'xxx', testObj );
} ) );
}
);
Это приведет к следующей ошибке:
TypeError: 'undefined' не является объектом (оценка '$ rootScope. $broadcast (' $locationChangeStart ', newUrl, oldUrl, $ location. $$ state, oldState).defaultPrevented ')
Почему? Что я делаю неправильно? Без $timeout в функции и теста он работает нормально.
Заранее благодарим за помощь.
:)
Изменить. Ожидается, что очередная широковещательная передача приведет к этой проблеме. гм
Я исправил эту проблему, вернув preventDefault
spyOn($rootScope, '$broadcast').and.returnValue({preventDefault: true})
Проблема -
Angular framework пытается вызвать функцию $broadcast
и ожидает, что объект из этой функции возвращается, у которого есть свойство defaultPrevented.
Но из-за
spyOn( $rootScope, '$broadcast' );
в beforeEach
блокировать фактическую реализацию $broadcast
не может быть вызвана и, следовательно, она не возвращает объект, который содержит свойство defaultPrevented
.
Решение -
Переместите оператор spyOn( $rootScope, '$broadcast' );
из блока beforeEach
в
it
заблокировать точно до scope.doIt( 'test1', 'test2' );
.