Стандартний набір для тестування Vue-компонентів:
- Vitest - запускач тестів на основі Vite: та сама конфігурація, що й у проєкті, підтримка
.vue-файлів і TypeScript без додаткових налаштувань; - Vue Test Utils (
@vue/test-utils) - монтує компонент, дає змогу знаходити елементи, взаємодіяти з ними й перевіряти результат; - jsdom чи happy-dom - імітація DOM браузера в Node.js.
npm i -D vitest @vue/test-utils jsdom
// vitest.config.ts
import { defineConfig } from 'vitest/config'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()],
test: { environment: 'jsdom' },
})
Тест:
import { mount } from '@vue/test-utils'
import { describe, it, expect } from 'vitest'
import Counter from './Counter.vue'
describe('Counter', () => {
it('starts from the given value and increments', async () => {
const wrapper = mount(Counter, { props: { start: 2 } })
expect(wrapper.get('[data-test="count"]').text()).toBe('2')
await wrapper.get('button').trigger('click')
expect(wrapper.get('[data-test="count"]').text()).toBe('3')
})
})
Ключові моменти:
mountрендерить компонент разом з усіма дочірніми;propsпередають значення як від батька; також єslotsіglobal(плагіни, заглушки, provide);triggerповертає Promise -awaitпотрібен, щоб Vue встиг оновити DOM;getкидає помилку, якщо елемент не знайдено (з зрозумілим повідомленням),findповертає порожню обгортку - зручно для перевірки відсутності:expect(wrapper.find('.error').exists()).toBe(false).
Атрибути data-test для пошуку елементів кращі за класи й структуру: стилі й розмітка змінюються, а тест - ні.
Що перевіряти: те, що бачить і робить користувач - текст, видимі елементи, події, виклики API, - а не внутрішні змінні компонента. Тоді рефакторинг не ламає тести.
Запуск: npx vitest (режим спостереження) чи npx vitest run у CI.