Programing

AngularJS에서 브로드 캐스트 이벤트를 어떻게 테스트 할 수 있습니까?

lottogame 2020. 11. 24. 07:32
반응형

AngularJS에서 브로드 캐스트 이벤트를 어떻게 테스트 할 수 있습니까?


루트 스코프에서 브로드 캐스트 이벤트를 내보내는 컨트롤러가 있습니다. broacast 이벤트가 올바르게 시작되었는지 테스트하고 싶습니다.

내 컨트롤러의 코드는 다음과 같습니다.

   $scope.$watch("pageIndex", function(){
    if($scope.pageIndex == 4)
    {
      // emit social share
      $rootScope.$broadcast('myEvent');
    }
  });

다음 코드로 테스트 해 보았습니다.

    it('Should call myEvent when pageIndex is 4',function(){
    scope.pageIndex = 4;
    scope.$apply();
    expect(rootScope.$on).toHaveBeenCalledWith('myEvent');
});

그러나 그것은 코드가 호출되지 않았다는 것을 알려주며 수동으로 테스트했습니다. 그런 다음 다음 코드로 시도했습니다.

it('Should call myEvent when pageIndex is 4',function(){
    var listener = jasmine.createSpy('listener');
    rootScope.$on('myEvent', listener);
    scope.pageIndex = 4;
    scope.$apply();
    expect(listener).toHaveBeenCalled();
});

그러나 동일한 부정적인 결과가 있습니다. 이벤트가 방송되는지 테스트하는 방법이 있습니까?


Jasmine을 사용한다고 가정하면 다음이 잘 작동합니다.

... other unit test setup code ...

var rootScope;
beforeEach(inject(function($injector) {
    rootScope = $injector.get('$rootScope');
    spyOn(rootScope, '$broadcast');
}));

describe("my tests", function() {
    it("should broadcast something", function() {
        expect(rootScope.$broadcast).toHaveBeenCalledWith('myEvent');
    });
});

메시지를 브로드 캐스팅하고 여기에 개체를 첨부하는 경우 개체가 예상과 일치하는지 테스트 할 수도 있습니다.

someObj = { ... something ... };
expect(rootScope.$broadcast).toHaveBeenCalledWith('someEvent', someObj);

다음은 mochaJs, mocks는 sinon, 기대는 chai입니다.

describe("broadcast test", function() {
  beforeEach(inject(function($rootScope){
   sinon.spy($rootScope, "$broadcast")
   scope.foo() //this broadcasts the event. $rootScope.$broadcast("testEvent")
 }))

it("broadcasts the event", inject(function($rootScope){
 expect($rootScope.$broadcast.calledWith("testEvent")).to.be.true
}))

})

참고URL : https://stackoverflow.com/questions/16757503/how-can-i-test-broadcast-event-in-angularjs

반응형