Angular jasmine: 'undefined' не является объектом - трансляция в течение таймаута - ошибка

У меня есть такая функция:

 $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 в функции и теста он работает нормально.

Заранее благодарим за помощь.

:)

Изменить. Ожидается, что очередная широковещательная передача приведет к этой проблеме. гм

Ответ 1

Я исправил эту проблему, вернув preventDefault

spyOn($rootScope, '$broadcast').and.returnValue({preventDefault: true})

Ответ 2

Проблема -

Angular framework пытается вызвать функцию $broadcast и ожидает, что объект из этой функции возвращается, у которого есть свойство defaultPrevented.

Но из-за

spyOn( $rootScope, '$broadcast' );

в beforeEach блокировать фактическую реализацию $broadcast не может быть вызвана и, следовательно, она не возвращает объект, который содержит свойство defaultPrevented.

Решение -

Переместите оператор spyOn( $rootScope, '$broadcast' ); из блока beforeEach в it заблокировать точно до scope.doIt( 'test1', 'test2' );.