В Vue компоненты могут получать атрибуты, которые не
объявлены явно через props. Такие атрибуты автоматически
передаются на корневой элемент компонента и могут использоваться для
управления поведением или стилем. В тестах это особенно важно, поскольку
проверка корректной передачи и наследования атрибутов гарантирует
правильное взаимодействие компонентов в составе приложения.
attrs в VueКаждый компонент Vue имеет специальное свойство $attrs,
которое содержит все атрибуты, переданные компоненту, но не
объявленные как props. Это включает:
id, class,
data-*)role,
aria-*)propsПример компонента:
export default {
name: 'BaseButton',
props: ['label'],
template: `<button>{{ label }}</button>`
}
При использовании:
<BaseButton label="Click me" id="btn1" data-test="button" />
label попадает в propsid и data-test попадают в
$attrsПо умолчанию Vue автоматически наследует эти атрибуты на
корневой элемент компонента, если не используется
inheritAttrs: false.
inheritAttrs: false запрещает Vue передавать не
объявленные атрибуты на корневой элемент. Это часто применяется для
оберток или кастомных элементов:
export default {
inheritAttrs: false,
props: ['label'],
template: `<button v-bind="$attrs">{{ label }}</button>`
}
Теперь атрибуты нужно явно привязывать через
v-bind="$attrs". В тестах необходимо проверять не
только наличие атрибутов в DOM, но и их корректное применение к нужным
элементам.
Vue Test Utils предоставляет методы mount и
shallowMount, которые позволяют тестировать передачу
атрибутов:
import { mount } from '@vue/test-utils'
import BaseButton from '@/components/BaseButton.vue'
const wrapper = mount(BaseButton, {
attrs: {
id: 'btn1',
'data-test': 'button'
},
props: {
label: 'Click me'
}
})
console.log(wrapper.attributes('id')) // 'btn1'
console.log(wrapper.attributes('data-test')) // 'button'
Ключевые моменты:
wrapper.attributes() возвращает значение конкретного
атрибута.wrapper.attributes() без параметров возвращает объект
со всеми атрибутами элемента.props, не отображаются в
$attrs.При тестировании составных компонентов важно учитывать, что
$attrs передаются вниз по иерархии, если
компонент их не использует. Это позволяет создать обертки без потери
данных:
export default {
name: 'Wrapper',
inheritAttrs: false,
template: `<BaseButton v-bind="$attrs" />`
}
Тест:
const wrapper = mount(Wrapper, {
attrs: { id: 'btn1', 'data-test': 'button' },
props: { label: 'Click me' }
})
expect(wrapper.findComponent(BaseButton).attributes('id')).toBe('btn1')
expect(wrapper.findComponent(BaseButton).attributes('data-test')).toBe('button')
mount и shallowMountmount рендерит все дочерние компоненты полностью,
поэтому можно проверять передачу атрибутов на вложенные элементы.shallowMount заменяет дочерние компоненты заглушками,
но $attrs все равно передаются, что позволяет проверять,
что атрибуты доступны для детей, даже если они не рендерятся.wrapper.attributes() для проверки
конкретного атрибута.inheritAttrs: true.inheritAttrs: false использовать
v-bind="$attrs" в шаблоне и тестировать конкретные
элементы.findComponent и attributes().data-*,
aria-*) в тесты для обеспечения доступности и правильной
интеграции.Передача динамических атрибутов:
const wrapper = mount(BaseButton, {
attrs: { 'aria-label': 'Submit', tabindex: 0 }
})
expect(wrapper.attributes('aria-label')).toBe('Submit')
expect(wrapper.attributes('tabindex')).toBe('0')
Атрибуты и события:
Атрибуты могут влиять на поведение, например
disabled:
const wrapper = mount(BaseButton, {
attrs: { disabled: true }
})
expect(wrapper.attributes()).toHaveProperty('disabled')
expect(wrapper.element.disabled).toBe(true)
Передача пользовательских данных в дочерние компоненты через
$attrs:
export default {
name: 'ParentWrapper',
inheritAttrs: false,
template: `<ChildComponent v-bind="$attrs" />`
}
const wrapper = mount(ParentWrapper, {
attrs: { 'data-test': 'child' }
})
expect(wrapper.findComponent({ name: 'ChildComponent' }).attributes('data-test')).toBe('child')
$attrs — основной механизм наследования атрибутов в
Vue.inheritAttrs: false отключает автоматическую
передачу.attributes().Эти знания обеспечивают корректное тестирование компонентов и их взаимодействие в реальном приложении, предотвращая потерю атрибутов и ошибок в UI.