#reactjs #react-testing-library #react-hook-form
#reactjs #react-testing-library #реагировать-форма-крючок
Вопрос:
Пытаюсь написать тест для моей формы react-hook, чтобы я мог проверить, правильно ли он отрисован. На данный момент я не справляюсь с первым препятствием и не могу заставить свою форму отображать своих дочерних элементов:
const props = {
request: true,
title: "testing title",
commentPlaceholder: "Placeholder",
tip: "helpful tip",
submitButtonText: "submit",
onSubmit: jest.fn(),
recipientName: "User one",
activeStep: 2,
};
it('Should render the CommentForm as if it was in the request flow', async () => {
const { getByText, getByTestId, debug } = render(
<CommentForm {...props} />
);
console.log(debug());
});
В журнале консоли выводится следующее:
<body>
<div>
<form />
</div>
</body>
Где в качестве компонента, который я тестирую, в нем много дочерних элементов для создания формы.
Я прикрепил его к оболочке, которую я использую в компоненте.
<StyledForm onSubmit={onSubmit} schema={CommentSchema} onChange={handleChange}>
Если я изменю это на форму, то она отобразит всех моих дочерних элементов. Это стилизованный компонент, который расширяет этот метод ниже:
const Form = ({ className, onSubmit, schema, defaultValues, children, mode, onChange, style }) => {
const methods = useForm({
defaultValues,
validationSchema: schema,
validateCriteriaMode: 'all',
mode: mode || 'onSubmit',
});
const { handleSubmit, watch } = methods;
const values = watch();
useEffect(() => {
onChange amp;amp; onChange(values);
}, [onChange, values]);
return (
<FormContext {...methods}>
<form style={style} className={className} onSubmit={handleSubmit(onSubmit)}>
{children}
</form>
</FormContext>
);
};
Я знаю, что это вызывает проблему, но я не могу понять, почему он не будет отображать компоненты. Это также причина, по которой, когда я меняю элемент StyledForm
на обычный form
, он работает.
** ОБНОВИТЬ **
Теперь выяснилось, что, похоже, это потому, что я расширяю styledComponent следующим образом:
export const StyledForm = styled(Form)`
width: 100%;
margin: 0 auto 50px;
`;
Ответ №1:
jest.mock('hoc/withForm', () => jest.fn(({ children }) => <form>{children}</form>));
Это было решение. Мне пришлось издеваться над моим HOC, чтобы он вернул более базовый элемент.