2013-10-18 2 views
20

브로드 캐스트 후 스코프가 채워 졌는지 테스트하려면 어떻게해야합니까? 나는 몇 가지 품질 보증을 stackexchange에서 찾았지만 아무도 내 문제에 답하지 못했습니다. 코드가 제대로 작동하고 테스트하는 방법을 모르겠습니다. 나는 초심자이며, 특히 재스민과 함께 테스트 할 수 있다고 덧붙일 수있다.

서비스 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'}]); 

});

스톤

당신은 스파이가 아무것도하지 않는 andCallThrough()를 사용하지 않는 경우 스파이 호출 실제 $ 방송 기능

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

수 있도록 재스민 말할 필요

+0

이 역시 도움이됩니다. http://stackoverflow.com/questions/15272414/how-can-i-test-events-in-angular – Ben

답변

36

. 가짜하려면

Jasmine Docs

편집

재스민 2를, 구문은

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

우리가 실제로 무엇을하고 있는지 자세히 설명해 주시겠습니까? – iamwhitebox

+0

@whitebox 그게 사실입니다.별로 효과가 없습니다. 기본적으로 Jasmine의 스파이는 스파이 활동을하는 원래 기능을 대체합니다. 'and.callThrough() '를 호출하면 기본 동작에 추가되어 스파이가 스파이웨어가 탐지 된 원래 함수를 호출하게됩니다. 그리고 그게 전부입니다. – ivarni

+0

브로드 캐스트가 호출되었다고 주장하는 경우 and.callThrough()가 필요하지 않습니다. –

0

$scope.$broadcast()에서 returnValue 당신이이 이가지 경우 같은 것을 수행 할 수 있습니다

사례 1 :

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

사례 2 : 지금까지 "을 toHavebeenCalled"으로 우려하고, "andCallThrough()"의 필요가 없습니다

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

. 단순한 스파이가 작동합니다. 귀하의 경우 귀하의 주장은 다릅니다. 당신이 좋아하는 방송된다

, rootScope $ 방송 ('updatecrappy'[{ID : 2, 이름 : '엉터리'}]).;

는하지만 예상 :

기대 (rootScope $ 방송.) .toHaveBeenCalledWith ('updscenes'[{ID : 2, 이름 : '엉터리'}]); "updarecrappy"인수에 만에

모습은 "updscenes"입니다 tohavebeencalled.

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'메소드에 간첩을 두지 않았습니다.

관련 문제