Форма перехвата реакции — недопустимый вызов перехвата в форме использования

#reactjs #typescript #jestjs #react-testing-library #react-hook-form

#reactjs #машинописный текст #jestjs #react-testing-library #форма перехвата реакции

Вопрос:

В настоящее время я пытаюсь выполнить модульное тестирование своего приложения с помощью библиотеки тестирования jest и react. Я получаю сообщение об ошибке от перехвата формы использования, который импортируется из форм перехвата реакции. Я использую тот же перехват таким же образом в других компонентах, но это единственный, который выходит из строя. Вот единственный тест, который у меня пока есть:

 import React from "react";
import { render } from "@testing-library/react";
import App from "./App";

describe("<App />", () => {
  test("smoke test", () => {
    render(<App />);
  });
});  

И это ошибка:

  FAIL  src/App.test.tsx
  <App />
    ✕ smoke test (119ms)

  ● <App /> › smoke test

    Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
    1. You might have mismatching versions of React and the renderer (such as React DOM)
    2. You might be breaking the Rules of Hooks
    3. You might have more than one copy of React in the same app
   

      33 | 
      34 | export const SearchForm: React.FC<SearchProps> = (props) => {
    > 35 |   const { register, handleSubmit } = useForm<FormData>();
         |                                      ^
      36 | 
      37 |   const onSubmit = handleSubmit(({ title, order }) => {
      38 |     fetch(`/api/movies/search/${title}?order=${order}`, {  

Вот компонент, который выдает ошибки при вызове useHook

 import React from "react";
import { useForm } from "react-hook-form";
import {
  Box,
  InputGroup,
  InputLeftElement,
  InputRightElement,
  FormControl,
  Input,
  Select,
  Icon,
} from "@chakra-ui/core/dist";

interface Movies {
  id: number;
  title: string;
  slug: string;
  picture_url: string;
  length: string;
  genres: string;
  avg: number;
  count: number;
}

interface SearchProps {
  onSearch: (movies: Movies[]) => void;
}

interface FormData {
  title: string;
  order: string;
}

export const SearchForm: React.FC<SearchProps> = (props) => {
  const { register, handleSubmit } = useForm<FormData>();

  const onSubmit = handleSubmit(({ title, order }) => {
    fetch(`/api/movies/search/${title}?order=${order}`, {
      method: "GET",
      headers: {
        "Content-Type": "application/json",
        Accept: "application/json",
      },
    })
      .then((res) => res.json())
      .then((json) => props.onSearch(json))
      .catch((err) => console.error(err));
  });

  return (
    <Box pt="4" margin="auto" ml="5rem" mr="5.5rem">
      <form onSubmit={onSubmit}>
        <FormControl>
          <InputGroup size="md">
            <InputLeftElement
              children={<Icon name="search" color="gray.300" />}
            />
            <Input
              name="title"
              placeholder="Search IMDbest"
              type="text"
              ref={register}
            />
            <InputRightElement
              children={
                <Select onChange={onSubmit} name="order" ref={register}>
                  <option value="asc">Avg rating ascending</option>
                  <option value="desc">Avg rating descending</option>
                </Select>
              }
            />
          </InputGroup>
        </FormControl>
      </form>
    </Box>
  );
};  

И вот родительский компонент

 import React, { useState, useEffect } from "react";
import { SearchForm } from "./forms/SearchForm";
import { Link } from "react-router-dom";
import { Box, Image, Icon, SimpleGrid, Skeleton } from "@chakra-ui/core/dist";

interface Movies {
  id: number;
  title: string;
  slug: string;
  picture_url: string;
  avg: number;
  genres: string;
  length: string;
  count: number;
}

export const MovieCards: React.FC = () => {
  const [movies, setMovies] = useState<Movies[]>([]);


  const handleSubmit = (movies: Movies[]) => {
    setMovies(movies);
  };

  return (
    <>
      <SearchForm onSearch={handleSubmit} />
    </>
  );
};  

Я запустил npm ls react и npm ls react-dom и подтвердил, что в моем проекте есть только один экземпляр каждой библиотеки, и оба они являются версиями 16.13.1 . Я не уверен, как поступить, поскольку перехват, похоже, вызывается правильно внутри функционального компонента, и я также использую тот же перехват в других компонентах таким же образом, и они не выдают ошибок.

Комментарии:

1. Попробуйте выполнить чистую установку ваших пакетов. При поиске проблем, подобных вашей, иногда кажется, что это исправлено. Пример github.com/react-hook-form/react-hook-form/issues/59

2. У меня была установлена форма перехвата реакции в неправильном package.json!