unit tutorial test run karma and javascript angularjs testing jasmine karma-runner

javascript - tutorial - jazmín angular: ''indefinido'' no es un objeto-emisión dentro de tiempo de espera-error



run angular test (2)

He solucionado este problema al devolver preventDefault

spyOn($rootScope, ''$broadcast'').and.returnValue({preventDefault: true})

Tengo una función como esta:

$scope.doIt = function( x, y ) { $timeout( function () { $rootScope.$broadcast( ''xxx'', { message: xxx, status: xxx } ); } ); }

Esta función funciona bien hasta el momento. Pero mientras escribía una prueba tuve algunos problemas.

describe( ''test doIt function...'', function () { var $rootScope, $timeout; beforeEach( inject( function ( _$rootScope_, _$timeout_ ) { $rootScope = _$rootScope_; $timeout = _$timeout_; spyOn( $rootScope, ''$broadcast'' ); spyOn( scope, ''doIt'' ).and.callThrough(); } ) ); it( ''test broadcast will be called'', inject( function () { var testObj = { message: ''test1'', status: ''test2'' }; scope.doIt( ''test1'', ''test2'' ); expect( $rootScope.$broadcast ).not.toHaveBeenCalledWith( ''xxx'', testObj ); $timeout.flush(); expect( $rootScope.$broadcast ).toHaveBeenCalledWith( ''xxx'', testObj ); } ) ); } );

Esto terminará en el siguiente error:

TypeError: ''undefined'' no es un objeto (evaluando ''$ rootScope. $ Broadcast ('' $ locationChangeStart '', newUrl, oldUrl, $ location. $$ state, oldState) .defaultPrevented'')

¿Por qué? ¿Que estoy haciendo mal? Sin $ timeout en la función y prueba funciona bien.

Gracias de antemano por tu ayuda.

:)

Editar: Otra emisión que se esperaba es emitir este problema. hmm


Problema -

El marco angular está intentando invocar la función $broadcast y esperar un objeto de esa función a cambio que tenga la propiedad defaultPrevented .

Pero a causa de

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

declaración en beforeEach bloque no se pudo invocar la implementación real de $broadcast y, por lo tanto, no devuelve un objeto que contiene la propiedad defaultPrevented .

Solución -

Mueva el spyOn( $rootScope, ''$broadcast'' ); declaración de beforeEach bloque para bloquear exactamente antes de scope.doIt( ''test1'', ''test2'' ); .