Tengo un gancho React personalizado de la siguiente manera:
export function useValidPolicyReference({ token, tenant, policyReference, }: UseValidPolicyReferenceProps): Record<string, boolean> { const [isValid, setIsValid] = React.useState<boolean>(true); React.useEffect(() => { async function fetchOnMount(): Promise<void> { try { await getPolicyByReference({ policyReference: policyReference as string, tenant, token, }); } catch (error) { setIsValid(false); } } if (tenant !== '' && policyReference !== null && token !== '') { fetchOnMount(); } }, [policyReference, tenant, token]); return { isValidPolicyReference: isValid, }; Quiero probar que isValidPolicyReference devolverá verdadero cuando getPolicyByReference no arroje y falso cuando lo haga.
Mi prueba para el caso real es la siguiente:
test('should be truthy if the policy reference is valid', () => { (getPolicyByReference as jest.Mock).mockImplementationOnce(() => Promise.resolve(true) ); const { result: { current }, waitForNextUpdate, } = render(); expect(current.isValidPolicyReference).toBeTruthy(); waitForNextUpdate(); expect(getPolicyByReference).toHaveBeenCalledWith({ token, tenant, policyReference, }); expect(current.isValidPolicyReference).toBeTruthy(); });Que pasa pero la prueba para el caso falso no:
test('should be falsy if the policy reference is invalid', () => { (getPolicyByReference as jest.Mock).mockImplementationOnce(() => Promise.reject(new Error('policy reference error')) ); const { result: { current }, waitForNextUpdate, } = render(); expect(current.isValidPolicyReference).toBeTruthy(); waitForNextUpdate(); expect(current.isValidPolicyReference).toBeFalsy(); });Falla por dos motivos:
console.error registrado en esta línea setIsValid(false); donde Warning: Can't perform a React state update on an unmounted component. No estoy seguro de cómo hacer que getPolicyByReference lance Jest para que el gancho devuelva el valor falso.
¿Qué no estoy haciendo correctamente? ¿Debería envolver mis casos de prueba en await async ? ¿Debería burlarme de axios.get en lugar de getPolicyByReference ?
También hay un error de consola registrado en esta línea setIsValid(false); donde Advertencia: no se puede realizar una actualización de estado de React en un componente desmontado.
Creo que el problema es que está tratando de probar el gancho solo con broma, cuando los ganchos solo se pueden llamar desde componentes internos.
La biblioteca de pruebas de reacción tiene muy buenos ayudantes para simplificar los ganchos de prueba, este artículo es bastante informativo al respecto.