21

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

所以,这里是代码:

服务 CrappySvc:

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

控制器 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

4 回答 4

36

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

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

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

茉莉花文档

编辑

使用 Jasmine 2,语法将是

spyOn($rootScope, '$broadcast').and.callThrough();
于 2013-10-18T05:57:53.623 回答
0

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

从 $rootScope 发出示例事件“onTimeChanged”。我的控制器有一个侦听器“onTimeChanged”,我在其中调用了一个方法 timeChanged()。

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

请注意,我没有监视 rootScope 的方法“$emit”。

于 2017-07-12T09:22:32.530 回答
0

如果想伪造returnValuefrom$scope.$broadcast()您可以执行以下两种情况:

情况1:

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

案例二:

scope.$broadcast('TEST_CHANGED', {test: 'test2'});
spyOn(scope, '$broadcast').and.callThrough();
expect(something2).toEqual('something2');
于 2016-09-06T16:16:28.413 回答
0

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

您正在广播, rootScope.$broadcast( 'updatecrappy', [{id : 2, name : 'crappy'}] );

但你期望:

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

查看参数“ updarecrappy ”,但实际上它是“ updscenes ”。

于 2016-10-04T00:18:15.777 回答