角茉莉:' undefined'不是对象 - 在超时内广播 - 错误

时间:2014-12-24 08:12:56

标签: javascript angularjs testing jasmine karma-runner

我有这样的功能:

 $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功能和测试它工作正常。

提前感谢您的帮助。

:)

编辑:然后预期的另一个广播是发布此问题。 HMM的

2 个答案:

答案 0 :(得分:8)

我已经通过返回preventDefault

解决了这个问题
spyOn($rootScope, '$broadcast').and.returnValue({preventDefault: true})

答案 1 :(得分:1)

问题 -

Angular框架试图调用$broadcast函数并期望该函数返回具有 defaultPrevented 属性的对象。

但是因为

spyOn( $rootScope, '$broadcast' );

beforeEach块中的

语句阻止$broadcast的实际实现无法被调用,因此它不会返回包含defaultPrevented属性的对象。

解决方案 -

spyOn( $rootScope, '$broadcast' );语句从beforeEach块移至 it恰好在scope.doIt( 'test1', 'test2' );之前阻止。