Resumen y Solución para Probar un Custom Hook en React

Resumen del Problema

Al aprender React, se intenta entender los custom hooks. Se ha creado un hook simple que actualiza un "step" interno al crearse, limpiar y permitir actualizaciones externas. Sin embargo, se está teniendo dificultades para implementar correctamente las pruebas unitarias sobre la actualización y limpieza del "step". El valor devuelto de "step" parece no actualizarse después de la creación del hook.

Análisis del Custom Hook

Se ha definido el custom hook useCustomHook de la siguiente manera:

const useCustomHook = (stepToSet: string) => {
  const [step, setStep] = useState('');

  useEffect(() => {
    if (stepToSet) {
      setStep(stepToSet);
    }

    return () => {
      setStep('cleanup');
    };
  }, [stepToSet]);

  const externalCb = (externalStepToSet: string) => {
    setStep(externalStepToSet);
  };

  return {
    step,
    externalCb,
  };
};

Problemas con la Prueba

El código de prueba asume que el valor de step se actualizará correctamente después de llamar a externalCb, pero no está funcionando como se espera.

Solución a los Problemas de Prueba

El problema principal se debe a que step no se está actualizando en las expectativas de la prueba. En la prueba, necesitas acceder a result.current.step después de cada acción que podría provocar un cambio en su valor.

Aquí hay una versión corregida de la prueba:

import {
  act, renderHook, 
} from '@testing-library/react-hooks';
import { expect, } from 'chai';

describe('useCustomHook Hook', () => {

  it('step updates test', async () => {

    const {
      result,
      unmount,
      waitFor,
    } = renderHook(() => {
      return useCustomHook('created');
    });

    expect(result.current.step).to.be.equal('created');

    // Actualiza el step externamente
    act(() => {
      result.current.externalCb('updated');
    });

    await waitFor(() => {
      expect(result.current.step).to.be.equal('updated');
    });

    // Desmonta el hook
    act(() => unmount());

    await waitFor(() => {
      expect(result.current.step).to.be.equal('cleanup');
    });
  });
});

Observaciones Finales

  1. Acceso a Resultados Actualizados: Es crucial verificar result.current.step después de cada acción, ya que React actualiza el estado de manera asíncrona.
  2. Estructura de espera: Utilizar waitFor para asegurar que las actualizaciones del estado se hayan procesado antes de hacer las afirmaciones.

Siguiendo estas correcciones, las pruebas de tu custom hook deberían funcionar correctamente y reflejar los cambios en el estado.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *