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'' );
.