source

Angular에서 브로드캐스트 이벤트를 테스트하려면 어떻게 해야 합니까?JS

factcode 2023. 3. 25. 11:55
반응형

Angular에서 브로드캐스트 이벤트를 테스트하려면 어떻게 해야 합니까?JS

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

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

   $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);

여기 모카제, 모크에는 시논, 기대에는 채를 사용하는 방법이 있습니다.

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

반응형