2013-10-18 38 views
20

如何在广播后测试范围是否已填充?我已经在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'}]); 

});

+0

我觉得这也有帮助:http://stackoverflow.com/questions/15272414/how-can-i-test-events-in-angular – Ben

回答

36

你需要告诉茉莉花让间谍呼叫实际$广播功能

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

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

Jasmine Docs

编辑

茉莉2,语法将

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

我们可以详细说明这实际上是在做什么? – iamwhitebox

+0

@whitebox就是这样,它并没有真正做得太多。默认情况下,Jasmine的间谍会替换正在侦测的原始函数。调用'and.callThrough()'会增加默认的行为,并使得间谍也*调用正在被窥探的原始函数。这确实是它所做的一切。 – ivarni

+0

你不需要在这种情况下的和.allThrough()如果你只是断言广播被称为 –

0

如果要伪造returnValue$scope.$broadcast()你可以做一些这样的两种情况:

案例1:

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

案例2:

scope.$broadcast('TEST_CHANGED', {test: 'test2'}); 
spyOn(scope, '$broadcast').and.callThrough(); 
expect(something2).toEqual('something2'); 
0

至于 “toHavebeenCalled” 而言,没有必要 “andCallThrough()” 中。简单的间谍会工作。在你的情况下你的论点是不同的。 $广播('updatecrappy',[{id:2,name:'crappy'}]);

但你想到:

预期(rootScope $播出。).toHaveBeenCalledWith('updscenes',[{ID:2,名称: '蹩脚'}]);

看看参数 “updarecrappy”,但在tohavebeencalled是 “updscenes”。

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'。