isVisible() — это метод, предоставляемый библиотекой Vue
Test Utils, который позволяет проверять, видим ли компонент или его
элемент в DOM. Он играет ключевую роль в тестировании пользовательских
интерфейсов, где важно убедиться, что элементы отображаются корректно в
зависимости от состояния приложения или условий рендеринга.
isVisible()Метод возвращает булево значение:
true — элемент видим для пользователя;false — элемент скрыт.Под видимостью понимается, что элемент:
offsetWidth > 0 && offsetHeight > 0);display: none или
visibility: hidden;display: none.Таким образом, isVisible() проверяет не только сам
элемент, но и его контекст в DOM.
Простейший пример использования метода:
import { mount } from '@vue/test-utils';
import MyComponent from '@/components/MyComponent.vue';
describe('MyComponent', () => {
it('отображает элемент при visible=true', () => {
const wrapper = mount(MyComponent, {
props: { visible: true }
});
const element = wrapper.find('.my-element');
expect(element.isVisible()).toBe(true);
});
it('скрывает элемент при visible=false', () => {
const wrapper = mount(MyComponent, {
props: { visible: false }
});
const element = wrapper.find('.my-element');
expect(element.isVisible()).toBe(false);
});
});
В этом примере метод isVisible() позволяет проверить
реактивное поведение компонента на изменение пропсов.
Vue Test Utils интегрируется с реактивностью Vue, поэтому
isVisible() корректно работает с динамическими изменениями
состояния:
it('динамически скрывает и отображает элемент', async () => {
const wrapper = mount(MyComponent, { props: { visible: true } });
const element = wrapper.find('.my-element');
expect(element.isVisible()).toBe(true);
await wrapper.setProps({ visible: false });
expect(element.isVisible()).toBe(false);
await wrapper.setProps({ visible: true });
expect(element.isVisible()).toBe(true);
});
Метод учитывает асинхронные обновления DOM после изменения состояния компонента.
Элементы, рендер которых управляется директивой v-if,
полностью удаляются из DOM, когда условие ложно. В таких случаях
isVisible() возвращает false для отсутствующих
элементов:
const wrapper = mount(MyComponent, { props: { show: false } });
const element = wrapper.find('.conditional');
expect(element.exists()).toBe(false);
// isVisible() для несуществующего элемента вызовет ошибку
Важно: перед вызовом isVisible() необходимо убедиться,
что элемент существует через exists(), чтобы избежать
ошибок.
В отличие от v-if, элементы с v-show
остаются в DOM, но скрываются через CSS. В этом случае
isVisible() корректно возвращает false:
const wrapper = mount(MyComponent, { props: { visible: false } });
const element = wrapper.find('.toggled');
expect(element.exists()).toBe(true);
expect(element.isVisible()).toBe(false);
opacity: 0 —
isVisible() вернёт true, так как элемент
физически присутствует в DOM и имеет размеры. Этот момент важно
учитывать при тестировании анимаций или прозрачных элементов.overflow: hidden) — isVisible() также вернёт
true, так как метод не проверяет положение на экране,
только рендеринг в DOM.position: absolute и
clip — аналогично, метод не детектирует визуальное
перекрытие или обрезку.isVisible() часто используется вместе с:
exists() — для проверки существования элемента;classes() — для проверки классов, управляющих
видимостью;text() — чтобы убедиться, что видимый элемент содержит
ожидаемый текст.Пример:
const wrapper = mount(MyComponent, { props: { visible: true } });
const element = wrapper.find('.message');
expect(element.exists()).toBe(true);
expect(element.isVisible()).toBe(true);
expect(element.classes()).toContain('active');
expect(element.text()).toBe('Привет, мир!');
exists() перед
isVisible().v-if использование isVisible()
напрямую может быть опасным, так как элемент может отсутствовать.isVisible().isVisible() является универсальным инструментом для
тестирования логики отображения компонентов Vue, обеспечивая ясные и
предсказуемые проверки в сочетании с реактивностью и условным
рендерингом.