Vue Test Utils предоставляет мощные инструменты для тестирования
компонентов Vue, включая возможность проверки встроенных стилей
элементов. Встроенные стили задаются через атрибут style
или через объект :style в шаблоне компонента. Проверка этих
стилей критична при тестировании динамического отображения элементов,
реактивных изменений стилей и условного применения CSS через
inline-стили.
При рендеринге компонента с помощью функции mount или
shallowMount возвращается объект wrapper,
который инкапсулирует компонент и его DOM. Для проверки стилей
используется метод .element или .get(), чтобы
получить доступ к DOM-узлу.
Пример доступа к элементу и проверке встроенного стиля:
import { mount } from '@vue/test-utils'
import MyComponent from '@/components/MyComponent.vue'
test('проверка встроенного цвета текста', () => {
const wrapper = mount(MyComponent)
const element = wrapper.get('p').element
expect(element.style.color).toBe('red')
})
Важный момент: свойство style у DOM-элемента возвращает
только inline-стили, применённые через атрибут style или
через объект :style. Стили из CSS-файлов или
<style> блока не будут видны через
element.style.
Vue позволяет задавать стили через объекты и массивы. Для
тестирования реактивных изменений необходимо сначала установить
состояние, затем вызвать wrapper.vm.$nextTick() для
ожидания обновления DOM, и только потом проверять стиль.
import { mount } from '@vue/test-utils'
import DynamicStyle from '@/components/DynamicStyle.vue'
test('изменение фона при клике', async () => {
const wrapper = mount(DynamicStyle)
const button = wrapper.get('button')
await button.trigger('click')
await wrapper.vm.$nextTick()
expect(wrapper.get('div').element.style.backgroundColor).toBe('blue')
})
Здесь важно помнить:
trigger имитирует события DOM.await wrapper.vm.$nextTick() гарантирует, что Vue
обработает реактивные изменения и обновит DOM.element.style возвращает стили в формате
camelCase (backgroundColor, fontSize).Если inline-стиль содержит несколько CSS-свойств, их можно проверять
через объект style или строку
getAttribute('style').
const style = wrapper.get('div').element.style
expect(style.color).toBe('white')
expect(style.fontSize).toBe('16px')
// Или как строку
const styleString = wrapper.get('div').element.getAttribute('style')
expect(styleString).toContain('color: white')
expect(styleString).toContain('font-size: 16px')
Метод .getAttribute('style') позволяет проверять
оригинальный атрибут style, сохраняя порядок и точное
оформление.
Для компонентов с условными стилями важно тестировать оба состояния:
test('стиль меняется в зависимости от пропса', async () => {
const wrapper = mount(MyComponent, {
props: { isActive: false }
})
expect(wrapper.get('div').element.style.opacity).toBe('0.5')
await wrapper.setProps({ isActive: true })
expect(wrapper.get('div').element.style.opacity).toBe('1')
})
Ключевые моменты:
setProps позволяет обновлять входные параметры
компонента.element.style.Иногда inline-стиль задаётся через вычисляемые свойства. В таких случаях необходимо убедиться, что computed возвращает правильный объект, и затем проверять стиль через DOM.
computed: {
dynamicStyle() {
return { color: this.active ? 'green' : 'gray' }
}
}
// Тест
test('computed стиль применяется корректно', async () => {
const wrapper = mount(MyComponent, { props: { active: false } })
expect(wrapper.get('span').element.style.color).toBe('gray')
await wrapper.setProps({ active: true })
expect(wrapper.get('span').element.style.color).toBe('green')
})
v-bind:style массивомVue позволяет передавать массив объектов стилей, где свойства могут перекрывать друг друга. В тестах проверяется итоговый стиль после объединения объектов.
<div :style="[baseStyle, overrideStyle]"></div>
// Тест
test('стили массива объединяются корректно', () => {
const wrapper = mount(MyComponent)
const element = wrapper.get('div').element
expect(element.style.color).toBe('blue') // overrideStyle
expect(element.style.fontSize).toBe('14px') // baseStyle
})
.element.style для проверки inline-стилей,
применённых через Vue.await wrapper.vm.$nextTick() после изменения
состояния..element.style..getAttribute('style').Эти подходы позволяют полностью контролировать и тестировать визуальное поведение компонентов Vue на уровне встроенных стилей, что особенно важно при разработке динамических и реактивных интерфейсов.