es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Sigo recibiendo un mensaje de error sobre evitar el envolvimiento de código en act después de envolver el código en act.

Estoy escribiendo una prueba para un componente que utiliza un formulario de búsqueda. Esto está en search.js e importa un formulario Formik desde otro archivo searchForm.js.

He escrito esta prueba unitaria que pasa. Me he basado en un ejemplo en la documentación de prueba de reacción aqui.

Cada vez que lo ejecuto, obtengo este error, lo cual me confunde, ¿ya que he envuelto todo el código en act()?

console.error
    Warning: Una actualización de Formik dentro de una prueba no estaba envuelta en act(...).

Cuando haces pruebas, el código que provoca actualizaciones de estado de React debe estar envuelto en act(...):

act(() => {
  /* disparar eventos que actualicen el estado */
});
/* comprobar la salida */

Esto asegura que estás probando el comportamiento que el usuario vería en el navegador. Obtén más información en https://reactjs.org/link/wrap-tests-with-act
import React from "react";
import { render, screen, act, fireEvent } from "@testing-library/react";
import Search from "./search.js";
import { ChakraProvider } from "@chakra-ui/react";

test("Input de formulario de búsqueda", () => {
  act(() => {
    const setup = () => {
      const utils = render(
        <chakraprovider>
          <search></search>
        </chakraprovider>
      );
      const searchTermsInput = utils.getByLabelText("input de términos de búsqueda");
      return {
        searchTermsInput,
        ...utils,
      };
    };
    const { searchTermsInput } = setup();

    fireEvent.change(searchTermsInput, { target: { value: "23" } });
  });

  expect(screen.getByLabelText("input de términos de búsqueda").value).toBe("23");
});
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error nos está indicando que una actualización de Formik dentro de la prueba no está envuelta en act. Esto significa que debemos envolver cualquier código que produzca una actualización de estado en act para asegurarnos de que estamos probando el comportamiento que el usuario vería en el navegador.

    En el código proporcionado, hemos envuelto el código que actualiza el campo de búsqueda en act, pero no el código que inicializa el componente usando la función render. Para solucionar el error, necesitamos envolver la función de configuración completa que llama a la función render en act:

    test("Search form input", () => {
      act(() => {
        const setup = () => {
          const utils = render(
            <chakraprovider>
              <search></search>
            </chakraprovider>
          );
          const searchTermsInput = utils.getByLabelText("search terms input");
          return {
            searchTermsInput,
            ...utils,
          };
        };
        const { searchTermsInput } = setup();
    
        fireEvent.change(searchTermsInput, { target: { value: "23" } });
      });
      expect(screen.getByLabelText("search terms input").value).toBe("23");
    });
    

    Ahora todo el código de prueba está envuelto en act y el error debería desaparecer.

Comments are closed.