В Vue компоненты часто используют props для передачи данных от родителя к дочернему компоненту. Иногда компоненты задают значения по умолчанию для props, чтобы обеспечить корректную работу даже при отсутствии передачи конкретного значения. В контексте тестирования понимание и правильная проверка этих значений крайне важны для обеспечения надёжности и предсказуемости поведения компонентов.
В Vue 3 props с дефолтными значениями определяются в объекте
props следующим образом:
export default {
props: {
title: {
type: String,
default: 'Заголовок по умолчанию'
},
count: {
type: Number,
default: 0
},
options: {
type: Array,
default: () => []
}
}
}
Ключевые моменты:
String, Number,
Boolean) значение по умолчанию может быть задано напрямую
через default.При использовании Vue Test Utils для тестирования
значений props по умолчанию основным инструментом является функция
mount. Она позволяет создавать экземпляр компонента с
возможностью указания или пропуска props.
Пример теста на значения по умолчанию:
import { mount } from '@vue/test-utils'
import MyComponent from '@/components/MyComponent.vue'
describe('MyComponent', () => {
it('должен использовать значение по умолчанию для props', () => {
const wrapper = mount(MyComponent)
// Проверка примитивного prop
expect(wrapper.props('title')).toBe('Заголовок по умолчанию')
// Проверка числового prop
expect(wrapper.props('count')).toBe(0)
// Проверка массива
expect(wrapper.props('options')).toEqual([])
})
})
Здесь важно обратить внимание на то, что props не были переданы при монтировании, поэтому компонент автоматически использует свои значения по умолчанию.
Тестирование также должно проверять корректность работы компонента
при передаче пользовательских значений props. Это делается через
передачу объекта props в функцию mount:
const wrapper = mount(MyComponent, {
props: {
title: 'Новый заголовок',
count: 5,
options: ['a', 'b', 'c']
}
})
expect(wrapper.props('title')).toBe('Новый заголовок')
expect(wrapper.props('count')).toBe(5)
expect(wrapper.props('options')).toEqual(['a', 'b', 'c'])
Таким образом можно убедиться, что значения по умолчанию корректно заменяются переданными props.
Props с дефолтными значениями часто используются внутри
computed или реактивных данных компонента. Тестирование
должно учитывать, что reactive зависимости и computed свойства
корректно реагируют на изменения props, включая значения по
умолчанию:
export default {
props: {
multiplier: {
type: Number,
default: 2
}
},
computed: {
doubled() {
return this.multiplier * 2
}
}
}
Тест:
it('computed doubled учитывает значение по умолчанию', () => {
const wrapper = mount(MyComponent)
expect(wrapper.vm.doubled).toBe(4)
wrapper.setProps({ multiplier: 3 })
expect(wrapper.vm.doubled).toBe(6)
})
Одной из частых ошибок является совместное использование одного объекта или массива по умолчанию между инстансами компонента. Vue рекомендует использовать функцию, возвращающую новый объект или массив:
props: {
config: {
type: Object,
default: () => ({ darkMode: false })
}
}
В тестах это критично, чтобы при изменении props одного экземпляра не затрагивались данные других:
const wrapper1 = mount(MyComponent)
const wrapper2 = mount(MyComponent)
wrapper1.vm.config.darkMode = true
expect(wrapper2.vm.config.darkMode).toBe(false)
wrapper.props() для чтения текущих
значений props.setProps корректно
обновляет состояние компонента.toEqual вместо
toBe при проверке значений в тестах.Иногда важно тестировать, что компонент корректно реагирует на непереданные props, используя внутренние значения по умолчанию:
it('корректно отображает UI без переданных props', () => {
const wrapper = mount(MyComponent)
expect(wrapper.text()).toContain('Заголовок по умолчанию')
})
Это гарантирует, что компонент остаётся работоспособным даже при минимальных входных данных.
Значения props по умолчанию являются ключевым аспектом проектирования компонентов и их тестирования. Они обеспечивают стабильность, предсказуемость и упрощают проверку поведения компонента в различных сценариях, от минимального набора данных до полностью кастомизированного состояния.