Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

305
Vistas
¿Por qué falla la prueba de formulario al usar React Hook Form?

Estoy usando react-hook-form para construir un formulario. El formulario funcionó bien, pero la prueba no está pasando.

La prueba pasa cuando no uso react-hook-form y jsut pass onSubmit <form onSubmit={onSubmit}> . Cuando paso onSubmit con handleSubmit <form onSubmit={handleSubmit(onSubmit)}> , no pasa.

Aquí está mi formulario App.js

 import { useForm } from "react-hook-form"; export default function App({ onSubmit = (data) => console.log(data) }) { const { handleSubmit, register } = useForm(); return ( // <form onSubmit={onSubmit}> <--- This works // <form onSubmit={handleSubmit(onSubmit)}> <--- This doesn't work <form onSubmit={handleSubmit(onSubmit)}> <input placeholder="Email" defaultValue="" key="email" {...register("email")} /> <input placeholder="Password" defaultValue="" key="password" {...register("password")} /> <input type="submit" value="submit" /> </form> ); }

Y aquí está la prueba que he escrito para ella App.test.js

 import { render, screen } from "@testing-library/react"; import App from "./App"; import userEvent from "@testing-library/user-event"; test("email and password field are clear for submit", async () => { const handleSubmit = jest.fn(); render(<App onSubmit={handleSubmit} />); userEvent.type(screen.getByPlaceholderText(/email/i), "test@example.com"); userEvent.type(screen.getByPlaceholderText(/password/i), "password"); userEvent.click(screen.getByText(/submit/i)); expect(handleSubmit).toHaveBeenCalledTimes(1); });

El código de trabajo también está disponible en https://codesandbox.io/s/react-hook-form-testing-olo4i

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

handleSubmit tiene debajo de la firma, como puede ver, el valor de retorno es una promesa. Es asíncrono.

Eso significa que llamarlo así handleSubmit(onSubmit)(e) devolverá una promesa.

 type UseFormHandleSubmit<TFieldValues extends FieldValues> = <TSubmitFieldValues extends FieldValues = TFieldValues>(onValid: SubmitHandler<TSubmitFieldValues>, onInvalid?: SubmitErrorHandler<TFieldValues>) => (e?: React.BaseSyntheticEvent) => Promise<void>;

Necesitas usar waitFor de RTL:

 import { render, screen, waitFor } from "@testing-library/react"; import App from "./App"; import userEvent from "@testing-library/user-event"; test("email and password field are clear for submit", async () => { const handleSubmit = jest.fn(); render(<App onSubmit={handleSubmit} />); userEvent.type(screen.getByPlaceholderText(/email/i), "test@example.com"); userEvent.type(screen.getByPlaceholderText(/password/i), "password"); userEvent.click(screen.getByText(/submit/i)); await waitFor(() => { expect(handleSubmit).toHaveBeenCalledTimes(1); }) });

Si no espera a que se complete el código asincrónico, es posible que se ejecute después de que finalice la aserción.

codigosandbox

Código fuente de referencia

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda