¿Cómo puedo probar eventos en angular?

Necesito probar que los eventos se emitan o emitan correctamente, y desencadenar eventos manualmente.

¿Cuál es la mejor manera de hacer esto?

Si solo necesitas algunas pruebas sobre el disparo y la captura del evento, así es como lo hago. Para garantizar que un determinado evento se active ( $emit -ed o $broadcast -ed), un espía es el camino a seguir. Necesita una referencia al scope que llamará $emit o $broadcast , y luego simplemente hacer algo como esto:

 spyOn(scope, "$emit") //run code to test expect(scope.$emit).toHaveBeenCalledWith("MY_EVENT_ID", other, possible, args); 

Si no necesita o no quiere preocuparse por los argumentos que se pasan con $emit , puede poner $on en $rootScope y establecer un indicador para saber que se emitió el evento. Algo como esto:

 var eventEmitted = false; $rootScope.$on("MY_EVENT_ID", function() { eventEmitted = true; }); //run code to test expect(eventEmitted).toBe(true); 

Para la funcionalidad de prueba que se ejecuta cuando se captura un evento ( $on ), es un poco más fácil. Simplemente obtenga $rootScope de la función de inject y luego envíe el evento deseado.

 $rootScope.$broadcast("EVENT_TO_TEST", other, possible, args); //expects for event here 

Ahora, me imagino que este manejo de eventos estaría sucediendo en una directiva o un controlador (o ambos). Para configurar las pruebas de directivas, consulte https://github.com/vojtajina/ng-directive-testing . Para configurar las pruebas de controlador, consulte https://github.com/angular/angular-phonecat/blob/master/test/unit/controllersSpec.js#L27

Espero que esto ayude.

Estos son los pasos que debes seguir para $ broadcast evento en angular JS

Al inyectar, inicialice el rootScope y el apéndice del scope como se indica a continuación:

 var rootScope; var scopeStub = beforeEach(function() { inject(function($rootScope, _$controller_) { rootScope = $rootScope; scopeStub = $rootScope.$new(); $controller = _$controller_; }); }); 

Después de que se crea el controlador eleva evento utilizando rootScope como se muestra a continuación:

 rootScope.$broadcast('eventName', parameter1); 

Usamos este sintax para A1

 =========== Controller ======== var vm = this; $scope.$on('myEvent', function(event, data){ console.log('event number', data.id); }); ============ Test ============= it('should throw myEvent', function() { var data = {}; $scope.$broadcast('myEvent', {id:1}); $scope.$broadcast('myEvent', {id:2}); $scope.$broadcast('myEvent', {id:3}); }); ============ Output ============ Chrome LOG: '--------------------------------------------' Chrome LOG: 'event number', 1 Chrome LOG: 'event number', 2 Chrome LOG: 'event number', 3