La función useSharedValue de react-native-reanimated no se actualiza en las pruebas de jest.
Actualmente estoy tratando de descubrir cómo probar las animaciones de reanimated 2 utilizando useSharedValue.
Lo que no tiene sentido para mí es el ejemplo proporcionado por reanimated.
https://github.com/software-mansion/react-native-reanimated/blob/master/tests/SharedValue.test.js
Si se supone que el botón incrementa su sharedValue en 1 cada vez que se presiona, ¿por qué escribirías una prueba que muestra que NO cambia?
Lo he intentado por mi cuenta y sí, el valor no se actualiza.
Quiero asegurarme de que el valor haya cambiado en mi prueba:
ParallaxScrollView.tsx
const scrollY = useSharedValue(0);
const onScroll = useAnimatedScrollHandler((event) => {
scrollY.value = event.contentOffset.y;
});
return (
<animated.image style=”{{height:” scrolly}}=”” testid=”header-image” source=”{{” uri:=”” headerimage=”” }}=”” resizemode=”cover”></animated.image>
)
ParallaxScrollView.test.tsx
const { getByTestId } = render(
const headerImage = getByTestId(‘header-image’);
const content = getByTestId(‘parallax-content’);
const eventData = {
nativeEvent: {
contentOffset: {
y: 100,
},
},
};
fireEvent.scroll(content, eventData);
expect(headerImage).toHaveAnimatedStyle({ height: 100 }); //Recibido es 0
davy.ai
Como experto en IT en react-native y react-native-reanimated, probar animaciones con useSharedValue puede ser un poco complicado. Un problema que se ha encontrado es que el ejemplo proporcionado en el repositorio oficial de react-native-reanimated en GitHub (https://github.com/software-mansion/react-native-reanimated/blob/master/__tests__/SharedValue.test.js) no parece tener sentido, ya que la prueba comprueba que un valor que se supone que aumenta cada vez que se presiona un botón (con
useDerivedValue
) no está cambiando realmente.Para probar adecuadamente una animación usando
useSharedValue
, es necesario llamarlo dentro del componente que utiliza la animación y luego activar el evento de animación (como desplazamiento, deslizamiento o pulsación) en el componente que se está probando. Por ejemplo, enParallaxScrollView.tsx
,scrollY
se declara comouseSharedValue
y luego se utiliza en el estiloscrollY
del componenteAnimated.Image
. EnParallaxScrollView.test.tsx
, se renderiza el componente, luego se dispara el eventoscroll
en el contenedor de contenido (content
) y, finalmente, se puede probar la animación contoHaveAnimatedStyle
.En este ejemplo, la afirmación es
expect(headerImage).toHaveAnimatedStyle({ height: 100 })
. Sin embargo, la prueba falla porque el comparadortoHaveAnimatedStyle
espera que la animación ya haya ocurrido. Una animación que utilizauseSharedValue
parte del valor inicial asignado auseSharedValue
y se actualiza con el tiempo a medida que se activa el evento de animación varias veces. Por lo tanto, para probar la animación, es necesario detener brevemente la prueba para permitir que la animación se actualice. Una forma de hacer esto es utilizandoawait waitFor
durante un breve período de tiempo antes de hacer la afirmación. El código actualizado se vería así:Esta prueba ahora esperará a que se actualice la animación y luego comprobará que el estilo
height
del componenteAnimated.Image
haya cambiado a100
.