#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!