如何在AngularJS中测试$ scope.$ on

sto*_*nau 21 unit-testing jasmine angularjs angularjs-scope

如何在广播后测试范围是否已填充?我在stackexchange中搜索并发现了一些QA,但没有人回答我的问题.代码工作正常,只是不知道如何测试它.我可以补充一点,我是测试新手,尤其是Jasmine.

那么,这是代码:

服务CrappySvc:

update: function() {
    $rootScope.$broadcast('updatecrappy', Crappy.query());
}   
Run Code Online (Sandbox Code Playgroud)

控制器GetCrappyCtrl:

  $scope.$on('updatecrappy', function(event, crap) {
    $scope.crap = crap;
  });
Run Code Online (Sandbox Code Playgroud)

茉莉花:

beforeEach(inject(function($rootScope, $httpBackend, $controller, Crappy) {
  rootScope = $rootScope;
  scope = $rootScope.$new();
  Crappy = mockCrappy;

      ...
  spyOn(rootScope, '$broadcast');
      ...

  ctrl = $controller('GetCrappyCtrl', {
  $scope : scope,
  Crappy : mockCrappy
});               
Run Code Online (Sandbox Code Playgroud)

}));

it('$scope.$on should have been triggered', function() {          
  rootScope.$broadcast('updatecrappy', [{id : 2, name : 'crappy'}]);
  expect(rootScope.$broadcast).toHaveBeenCalledWith('updscenes', [{id : 2, name : 'crappy'}]);
Run Code Online (Sandbox Code Playgroud)

});

iva*_*rni 36

你需要告诉Jasmine让间谍调用实际的$ broadcast函数

spyOn($rootScope, '$broadcast').andCallThrough();
Run Code Online (Sandbox Code Playgroud)

如果你不使用andCallThrough()间谍什么都不做.

Jasmine Docs

编辑

使用Jasmine 2,语法将是

spyOn($rootScope, '$broadcast').and.callThrough();
Run Code Online (Sandbox Code Playgroud)