如何在AngularJS Karma单元测试中触发`$on`事件?

我试图触发在$rootScope.broadcast()事件时触发的控制器中的$scope.$on()方法.我发现这个问题很有用: How can I test events in angular?,但是我仍然无法通过控制器的$scope检测从$rootScope广播的事件.

到目前为止,我已经设法测试在相应的$rootScope上调用$broadcast方法,但是在$rootScope上调用$broadcast时,并没有在相应的$scope上调用$on方法.

我试图在我的测试中直接播放$rootScope.$,但是我的间谍没有接受这个事件.

这是我的控制器:

angular.module('app.admin.controllers.notes',[])
    .controller('NotesCtrl',function($scope) {

      $scope.$on('resource-loaded',function(event,resource) { // I want to test this
        $scope.parentType = resource.type;
        $scope.parentId = resource.id;
      });

    });

这是我的测试:

describe('The notes controller',function() {

  beforeEach(module('app.admin.controllers.notes'));

  var scope,rootScope,NotesCtrl;

  beforeEach(inject(function($controller,$injector,$rootScope) {
    rootScope = $rootScope;
    scope = $rootScope.$new(); // I've tried this with and without $new()
    NotesCtrl = $controller('NotesCtrl',{$scope: scope}); // I've tried explicitly defining $rootScope here
  }));

  it('should respond to the `resource-loaded` event',function() {
    spyOn(scope,'$on');
    rootScope.$broadcast('resource-loaded'); // This is what I expect to trigger the `$on` method
    expect(scope.$on).toHaveBeenCalled();
  });

});

here’s the plunkr.我已经包含了$broadcast方法的通过测试以供参考,主要是因为我以相同的方式设置了测试.

我已经阅读了很多关于在AngularJS中测试事件的问题,它似乎总是一个范围问题.我听说在Karma单元测试中,$rootScope和$scope是一回事,但我不确定其含义是什么.我已经尝试将$rootScope和$scope定义为同一个对象,并在测试期间明确地将$rootScope注入NotesCtrl,但没有任何东西使我的测试变为绿色.

如何在我的NotesCtrl中获取$on方法来触发此测试?

是什么使它无法正常工作的事实是你正在监视$on函数.它不合理时工作正常: http://plnkr.co/edit/hNEj7MmDDKJcJ7b298OB?p=info.原因其实很简单.当事件被brodcasted时,所谓的不是$on()函数.所谓的回调函数是作为参数传递给之前的$on():监听器.

请注意,通过监视$on函数,您不会在此处测试代码.你要测试的是,当广播en事件时,子范围接收它.所以你正在测试AngularJS本身.

相关文章

ANGULAR.JS:NG-SELECTANDNG-OPTIONSPS:其实看英文文档比看中...
AngularJS中使用Chart.js制折线图与饼图实例  Chart.js 是...
IE浏览器兼容性后续前言 继续尝试解决IE浏览器兼容性问题,...
Angular实现下拉菜单多选写这篇文章时,引用文章地址如下:h...
在AngularJS应用中集成科大讯飞语音输入功能前言 根据项目...
Angular数据更新不及时问题探讨前言 在修复控制角标正确变...