¿Cómo llamar a useEffect actualizando valores en un proveedor de Context con react testing library?
Lo que estoy intentando es probar si un componente, que depende de un contexto, llama a useEffect
y a una función (mockeada por jest.fn()
) desde allí.
Aquí hay una versión simplificada de mi código:
MyComponent.tsx
“`
export function MyComponent() {
const ref = createRef();
const { date } = useMyContext(); // “date” es un string (por ejemplo, 2021-11-01
)
useEffect(() => {
if (date && ref.current)
ref.current.scrollIntoView();
}, [date, ref]);
return (
<div>
{/* otros elementos están aquí */}
<AnotherComponent ref={ref} />
</div>
);
}
MyComponent.test.tsx
it(‘debe desplazarse a AnotherComponent cuando se actualice la fecha’, () => {
const mockContextValue = { date: ‘2021-11-01’ };
window.HTMLElement.prototype.scrollIntoView = jest.fn();
render(
<MyContext.Provider value={mockContextValue}>
<MyComponent />
</MyContext.Provider>,
);
// actualiza la fecha en MyContext.Provider
// luego, debería llamarse useEffect
// luego, espera que se haya llamado scrollIntoView
});
No tengo idea de cómo
1. actualizar el valor de date
en MyContext
después de que se renderice MyComponent
por la función de render de @testing-library/react
2. ver si se llamó a useEffect
después de que se actualizó date
He estado buscando en Google durante horas y horas, pero no he encontrado ninguna solución. Cualquier consejo será apreciado.
davy.ai
Para actualizar el valor
date
enMyContext
después de queMyComponent
sea renderizado a través de la funciónrender
de@testing-library/react
, se puede utilizar la funciónact
dereact-dom/test-utils
. Esto permite actualizar el estado de una forma similar a como se actualizaría en una aplicación real. Aquí hay un ejemplo de código:En este ejemplo, se puede observar que la función
act
se utiliza para actualizar el valordate
a'2021-11-02'
. Esto activará cualquier efecto secundario relevante, como eluseEffect
enMyComponent
.Para verificar si
useEffect
fue llamado después de que se actualizódate
, se puede utilizar la funciónjest.spyOn
para crear un espía del hookuseEffect
. Luego, se puede activar la actualización utilizandoact
y verificar que el espía fue llamado. Aquí hay un ejemplo:En este ejemplo, el espía
useEffect
se crea utilizandojest.spyOn(React, 'useEffect')
, y luego se verifica que se ha llamado medianteexpect(useEffectSpy).toHaveBeenCalled()
. Esto nos permite probar queuseEffect
se activa por cambios en el valordate
, como se espera.