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

时间:2013-10-18 04:48:52

标签: unit-testing angularjs jasmine angularjs-scope

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

所以,这是代码:

服务CrappySvc:

update: function() {
    $rootScope.$broadcast('updatecrappy', Crappy.query());
}   

Controller GetCrappyCtrl:

  $scope.$on('updatecrappy', function(event, crap) {
    $scope.crap = crap;
  });

茉莉花:

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

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

  ctrl = $controller('GetCrappyCtrl', {
  $scope : scope,
  Crappy : mockCrappy
});               

}));

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

});

4 个答案:

答案 0 :(得分:36)

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

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

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

Jasmine Docs

修改

使用Jasmine 2,语法为

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

答案 1 :(得分:0)

如果想假装来自returnValue的{​​{1}},您可以执行以下两种情况:

案例1:

$scope.$broadcast()

案例2:

scope.$broadcast('TEST_CHANGED', {test: 'test1'});
spyOn(scope, '$broadcast').and.callThrough();
expect(something).toEqual('something');

答案 2 :(得分:0)

就“ toHavebeenCalled ”而言,不需要“ andCallThrough ()”。简单的间谍会起作用。在你的情况下,你的论点是不同的。

你是广播的, rootScope。$ broadcast('updatecrappy',[{id:2,name:'crappy'}] );

但你期望:

期待(rootScope。$ broadcast).toHaveBeenCalledWith('updscenes',[{id:2,name:'crappy'}]);

查看参数“ updarecrappy ”,但是在其中称为“ updscenes ”。

答案 3 :(得分:0)

请看下面的示例代码,它对我很有用。

发出示例事件' onTimeChanged'来自$ rootScope。我的控制器有一个听众' onTimeChanged'我在里面调用了一个方法timeChanged()。

describe('onTimeChanged()', function() {
    it('should call another method or controller', function() {
        spyOn(searchCtrl, 'timeChanged');
        $rootScope.$emit('onTimeChanged');
        expect(searchCtrl.timeChanged).toHaveBeenCalled();
    });
});

请注意,我没有间谍方法' $ emit' of rootScope。