在AngularJS上测试$

在AngularJS上测试$,angularjs,jasmine,Angularjs,Jasmine,我正在测试控制器是否能够接收广播。以下是控制器内部部分的$: $scope.$on('gridService_chkdItems', function() { if( $scope.pageModel.chkdItems !== undefined ) { $scope.pageModel.chkdItems = []; } $scope.pageModel.chkdItems = gridService.getChkd

我正在测试控制器是否能够接收广播。以下是控制器内部部分的
$:

$scope.$on('gridService_chkdItems', function() {

        if( $scope.pageModel.chkdItems !== undefined  ) {
            $scope.pageModel.chkdItems = [];
        }
        $scope.pageModel.chkdItems = gridService.getChkdItems();  
        $scope.$apply();
    });
在我的测试中,我是这样做的:

beforeEach( inject( function($injector) {
  rootScope =  $injector.get( '$rootScope' );
  scope = rootScope;
  spyOn( scope, '$on' );
}));
在我的测试中,我通过执行以下操作来检查
$on
服务是否拾取目标事件:

 it( 'should pick up the chkdItems broadcast on the grid service',function() {
   expect( scope.$on ).toHaveBeenCalledWith( 'gridService_chkdItems', Function );    
 });
它失败了,给了我一个奇怪的错误,本质上说它是用我期望的方法调用的,但仍然失败了——为什么

Expected spy $on to have been called with [ 'gridService_chkdItems', Function ] 
but actual calls were [ 'gridService_chkdItems', Function ]

您可以根据
任何
函数更改期望值

expect( scope.$on )
  .toHaveBeenCalledWith(
    'gridService_chkdItems', 
    jasmine.any(Function));

那很有效-谢谢!但是,如果我正在传递一个函数对象,而它期望一个函数对象,那么测试失败的原因是什么?它们是不同的引用。我认为您测试的代码是错误的。测试AngularJS是否调用了正确的事件处理程序不是您的任务。这是由AngularJS开发人员完成的。您应该在事件发生时测试事件处理程序的逻辑。还要尽量避免在事件处理程序中调用$apply()。如果事件本身是从angularJS外部触发的,请将广播用$apply包装。感谢您的评论-我是负责测试代码的angular开发人员。我没有在这里补充的是,事件内部的逻辑正在被触发,但要正确地确定这一点,您需要知道事件是否确实被拾取