#reactjs #react-testing-library
Вопрос:
У меня есть следующий код:
return (
<img
ref={imgRef}
src={url}
alt={alt}
onLoad={() => {
if (imgRef.current?.naturalWidth) setIsImgLoaded(true);
}}
style={!isImgLoaded ? { display: 'none' } : {}}
/>
Поэтому, когда изображение завершает загрузку (проверив его naturalWidth
), я обновляю isImgLoaded
true
его и отображаю (в начале, как вы можете видеть, я display: none
установил для изображения).
В моих тестах, всякий раз, когда я пытаюсь сделать:
expect(screen.getByRole('img')).toExist()
Я получаю ошибку TestingLibraryElementError: Unable to find role="img"
, даже если пытаюсь использовать waitFor
или findByRole
.
Что я могу сделать?
Комментарии:
1. И вы проверили
img
, действительно ли визуализация на DOM вне среды модульного тестирования?2. Да, я проверил, так оно и есть.
3. Можете ли вы использовать этот
debug
метод в модульном тесте и распечатать на консоли ?const { debug } = render(<Component />); console.log(debug())
Я подозреваю, что элемент визуализируется во время модульного тестирования. Это должно подтвердить эту часть.4. Я не думаю
debug()
, что это работает внутриconsole.log()
. Когда я помещаюscreen.debug()
внутрь свой тест, он показываетimg
элемент.
Ответ №1:
Вам необходимо явно вызвать onLoad
событие изображения, чтобы вызвать его обратный вызов и сделать изображение видимым во время теста.
test("image is visible after loading", () => {
render(<TestComponent />)
// Use `{ hidden: true }` to access the image while it's not visible
const image = screen.getByRole('img', { hidden: true })
fireEvent.load(image)
// No longer requires `{ hidden: true }` as the image is now visible
expect(screen.getByRole('img')).toBeInTheDocument()
});
Комментарии:
1.
naturalWidth
ссылка на img остается на0
(хотя я дал ей действительный URL img)2. Вероятно, вам придется слишком явно указать это в своем тесте.