Причина, по которой ваш тест не работает, заключается в том, что вы используете getByTestId
, чтобы найти свой элемент.getByTestId
ищет DOM-узел с атрибутом data-testid
.
Чтобы пройти тест, у вас есть несколько вариантов.
Вы можете добавить data-testid
к вашемуinput
: <input data-testid="input" onChange={onChange} />
.Это сработало бы, однако лучше избегать тестовых идентификаторов всякий раз, когда вы можете.
В реальном приложении ваш ввод будет отображаться с label
, мы можем воспользоваться этим:
const { getByLabelText } = render(
<label>
My input
<Input onChange={onChange} />
</label>
)
const input = getByLabelText('My input')
Другим решением является использование container
, которое является одним из значений, возвращаемых render
.Это DOM-узел, как и все остальное в RTL, поэтому вы можете использовать обычные DOM API:
const { container } = render(<Input onChange={onChange} />)
// Any of these would work
const input = container.firstChild
const input = container.querySelector('input')
В качестве примечания, я согласен, что RTL-тесты кажутся более сложными по сравнению с Enzyme.Для этого есть веская причина.RTL подталкивает вас к тестированию вашего приложения, как если бы оно было черным ящиком.В начале это сделать немного сложнее, но в конечном итоге это приведет к улучшению тестов. С другой стороны, фермент
по умолчанию воспроизводит большинство вещей и позволяет вам взаимодействовать с реализацией ваших компонентов.По моему опыту, вначале это выглядит проще, но даст хрупкие тесты.
Я призываю вас присоединиться к каналу спектра , если вам нужна помощь для начала работы.